Node.js 常用Mongoose方法
Node.js 手冊查詢-Mongoose 方法
一、Schema
一種以文件形式存儲的數據庫模型骨架,無法直接通往數據庫端,也就是說它不具備對數據庫的操作能力.可以說是數據屬性模型(傳統意義的表結構),又或著是“集合”的模型骨架
/* 定義一個 Schema */ var mongoose = require("mongoose");var TestSchema = new mongoose.Schema({name : { type:String },//屬性name,類型為Stringage : { type:Number, default:0 },//屬性age,類型為Number,默認為0time : { type:Date, default:Date.now },email: { type:String,default:''} });上面這個 TestSchema包含4個屬性 [name, age, time, email]
二、Model
由Schema構造生成的模型,除了Schema定義的數據庫骨架以外,還具有數據庫操作的行為,類似于管理數據庫屬性、行為的類?
var db = mongoose.connect("mongodb://127.0.0.1:27017/test");// 創建Model var TestModel = db.model("test1", TestSchema);test1 數據庫中的集合名稱, 不存在會創建.
model - 文檔操作
mongoose的操作方法基本都在文檔操作中。
1.構造函數, 參數1:集合名稱, 參數2:Schema實例
db.model(“test1”, TestSchema );2.查詢, 參數1忽略,或為空對象則返回所有集合文檔
model.find({}, callback);model.find({},field,callback); 過濾查詢,參數2: {‘name’:1, ‘age’:0} 查詢文檔的返回結果包含name , 不包含age.(_id默認是1)model.find({},null,{limit:20}); 過濾查詢,參數3: 游標操作 limit限制返回結果數量為20個,如不足20個則返回所有.model.findOne({}, callback); 查詢找到的第一個文檔model.findById(‘obj._id’, callback); 查詢找到的第一個文檔,同上. 但是只接受 __id 的值查詢3.創建, 在集合中創建一個文檔
Model.create(文檔數據, callback))4.更新,參數1:查詢條件, 參數2:更新對象,可以使用MondoDB的更新修改器
Model.update(conditions, update, function(error)5.刪除, 參數1:查詢條件
Model.remove(conditions,callback);更新修改器:
6.‘$inc’ 增減修改器,只對數字有效.下面的實例: 找到 age=22的文檔,修改文檔的age值自增1
Model.update({‘age’:22}, {’$inc’:{‘age’:1} } ); 執行后: age=237.‘$set’ 指定一個鍵的值,這個鍵不存在就創建它.可以是任何MondoDB支持的類型.
Model.update({‘age’:22}, {’$set’:{‘age’:‘haha’} } ); 執行后: age=‘haha’8.‘$unset’ 同上取反,刪除一個鍵
Model.update({‘age’:22}, {’$unset’:{‘age’:‘haha’} } ); 執行后: age鍵不存在數組修改器:
9.‘$push’ 給一個鍵push一個數組成員,鍵不存在會創建
Model.update({‘age’:22}, {’$push’:{‘array’:10} } ); 執行后: 增加一個 array 鍵,類型為數組, 有一個成員 1010.‘$addToSet’ 向數組中添加一個元素,如果存在就不添加
Model.update({‘age’:22}, {’$addToSet’:{‘array’:10} } ); 執行后: array中有10所以不會添加11. ‘$each’ 遍歷數組, 和 $push 修改器配合可以插入多個值
Model.update({‘age’:22}, {’$push’:{‘array’:{’$each’: [1,2,3,4,5]}} } ); 執行后: array : [10,1,2,3,4,5]12.‘$pop’ 向數組中尾部刪除一個元素
Model.update({‘age’:22}, {’$pop’:{‘array’:1} } ); 執行后: array : [10,1,2,3,4] tips: 將1改成-1可以刪除數組首部元素13.‘$pull’ 向數組中刪除指定元素
Model.update({‘age’:22}, {’$pull’:{‘array’:10} } ); 執行后: array : [1,2,3,4] 匹配到array中的10后將其刪除條件查詢:
a. “$lt” 小于
b. “$lte” 小于等于
c. “$gt” 大于
d. “$gte” 大于等于
e. “$ne” 不等于
params = {salePrice:{$gt: priceGt,$lte: priceLt}} let goodsModel = Goods.find(params)或查詢 OR:
- ‘$in’ 一個鍵對應多個值
- ‘$nin’ 同上取反, 一個鍵不對應指定值
- “$or” 多個條件匹配, 可以嵌套 $in 使用
- “$not” 同上取反, 查詢與特定模式不匹配的文檔  Model.find({“age”:{ “$in”:[20,21,22.‘haha’]} } );
查詢 age等于20或21或21或’haha’的文檔Model.find({"$or" :  [ {‘age’:18} , {‘name’:‘xueyou’} ] });
查詢 age等于18 或 name等于’xueyou’ 的文檔  類型查詢:null 能匹配自身和不存在的值, 想要匹配鍵的值 為null, 就要通過 “$exists” 條件判定鍵值已經存在 "$exists" (表示是否存在的意思) 
-   Model.find(“age” :  { “$in” : [null] , “exists” : true  } );
查詢 age值為null的文檔   Model.find({name: {$exists: true}},function(error,docs){//查詢所有存在name屬性的文檔
});Model.find({telephone: {$exists: false}},function(error,docs){//查詢所有不存在telephone屬性的文檔
});  正則表達式:MongoDb 使用 Prel兼容的正則表達式庫來匹配正則表達式 find( {“name” : /joe/i } ) 查詢name為 joe 的文檔, 并忽略大小寫find( {“name” : /joe?/i } ) 查詢匹配各種大小寫組合查詢數組:Model.find({“array”:10} ); 查詢 array(數組類型)鍵中有10的文檔, array : [1,2,3,4,5,10] 會匹配到Model.find({“array[5]”:10} ); 查詢 array(數組類型)鍵中下標5對應的值是10, array : [1,2,3,4,5,10] 會匹配到$all’ 匹配數組中多個元素 Model.find({“array”:[5,10]} ); 查詢 匹配array數組中 既有5又有10的文檔‘$size’ 匹配數組長度 Model.find({“array”:{"$size" : 3} } ); 查詢 匹配array數組長度為3 的文檔‘$slice’ 查詢子集合返回 Model.find({“array”:{"$skice" : 10} } ); 查詢 匹配array數組的前10個元素Model.find({“array”:{"$skice" : [5,10] } } ); 查詢 匹配array數組的第5個到第10個元素? 
常用方法:
1、刪除購物車
/** * 購物車刪除 */ router.post('/cart/del', function(req, res, next) {var userId = req.cookies.userId,productId = req.body.productId;User.update({userId: userId // 根據 ID 找到相對應的數據庫數據 },{$pull:{ // 刪除特定元素'cartlist': { // 找到 相對的cartlist 根據 productId 刪除相對應的 數據'productId': productId}}}, (err, doc) => {if(err){res.json({status: "1",msg: err.message,result: ''});}else{res.json({status: "0",msg: '',result: doc});}}); });?2、購物車數量修改
/** * 購物車數量修改 */ router.post('/cart/edit', function(req, res, next) {var userId = req.cookies.userId,productId = req.body.productId,productNum = req.body.productNum;// 根據 userId 先找到這個用戶數據,再找到跟傳遞過來的 productId 相對應的 cartlist 里面的那個商品數據,第一步是查找數據// 這個不找找的是就是子數據,不是 productNum 相對應的那個商品 json User.update({"userId": userId,"cartlist.productId": productId},{// 找到那個數據之后 利用這個方法更改數量'cartlist.$.productNum': productNum}, (err, doc) => {if(err){res.json({status: "1",msg: err.message,result: ''});}else{res.json({status: "0",msg: '',result: 'suc'});}}); });3、新增地址(向數據庫新添加數據)
router.post('/addNewAddress', (req, res, next) => {var userId = req.cookies.userId,addressName = req.body.addressName,tel = parseFloat(req.body.tel),streetName = req.body.streetName,postCode = req.body.postCode;User.findOne({userId: userId}, (err, doc) => {if(err){res.json({status: "1",msg: err.message,result: ''});}else{if(doc){var addressList = doc.addressList,num = parseInt(addressList.length) - 1,addressId = addressList[num].addressId,addressNewId = '';addressNewId = parseInt(addressId) + 1;var jsonNew = {addressId: addressNewId,addressName: addressName,tel: tel,streetName: streetName,postCode: postCode};// 將新建的json數據直接push到以前的數組中,然后保存就可以了 addressList.push(jsonNew);doc.save((err1, doc1) => {if(err1){res.json({status: "1",msg: err1.message,result: ''});}else{res.json({status: "0",msg: '',result: 'suc'});}});}}}); });?4、查看所有地址(查)
/** * addressList */ router.get('/addressList', function(req, res, next) {var userId = req.cookies.userId;User.findOne({userId: userId}, (err, doc) => {if(err){res.json({status: "1",msg: err.message,result: ''});}else{if(doc){res.json({status: "0",msg: '',result: doc.addressList});}}}); });?
轉載于:https://www.cnblogs.com/haonanZhang/p/8306008.html
總結
以上是生活随笔為你收集整理的Node.js 常用Mongoose方法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 用requests爬取一个招聘网站
- 下一篇: Mvc异步
