首先確保你已安裝了mongodb,而且配置了mongodb的環境變量。
在任意目錄(建議在非中文目錄)下新建database文件夾,在此文件夾下新建test文件夾(確保此文件夾爲空的)。
而後打開cmd,輸入:java
mongod --dbpath 'test文件夾的絕對路徑———— E:\database\test'
waiting for connections on port 27017 說明你已經在localhost:27017端口上開啓了服務。
此時再進入test文件夾,裏面會有許多WT文件。node
新建一個index.js(任意目錄,最好新建一個mongodbDemo文件夾便於管理)。正則表達式
var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var db = mongoose.connection; db.on('error',console.error.bind(console,'mongodb鏈接錯誤:')); db.once('open',function(){ console.log('mongodb connection is OK!'); });
安裝mongoose依賴包,運行此文件mongodb
npm install mongoose node index.js
說明已成功鏈接到數據庫。數據庫
mongoose寫入數據的方法有兩個,分別是Model.create()和Documents.save()[即上文的Entity];npm
1.在寫入數據以前,先新建一個model數組
var CatSchema = new mongoose.Schema({ // 新建一個model對象 name: String }); var CatModel = mongoose.model('Cat', CatSchema); // 這一步才正式寫入數據庫,數據庫對應的model名爲Cat
2.插入一條數據promise
//Model.create CatModel.create({name: 'ketty'},function(err,res){ // 第一個參數規定爲錯誤信息 console.log(err); console.log(res); }) //promise寫法 CatModel.create({ name: 'kitty' }).then(res=>{console.log(res)}) // 成功返回當前數據 .catch(err=>{console.log(err)}); // Documents.save() var catDoc = new CatModel({name:'ketty'}); catDoc.save(function (err, res) { if (err)console.log(err); console.log(res); });
Model.find().then(res=>{ // 傳空匹配全部 log(res); }).catch(err=>{ log(err); }); Model.find({name: 'kitty'}).then(res=>{ // 匹配name爲kitty的全部數據 log(res); // 若爲查詢到數據 res爲[] }).catch(err=>{ log(err); }); Model.findOne({name: 'kitty'}).then(res=>{ // 匹配name爲kitty的第一條數據 log(res); // 若爲查詢到數據 res爲null }).catch(err=>{ log(err); }); Model.findById(id).then(res=>{// 根據id查詢 // tido }).catch(err=>{ // tido })
find和findOne只接受Object做爲參數,若是未傳參數則默認爲{}。傳其餘數據類型都會拋出異常mongoose
「$lt」 小於
「$lte」 小於等於
「$gt」 大於
「$gte」 大於等於
「$ne」 不等於函數
// 查詢 age 大於等於18並小於等於30的文檔 Model.find({'age':{ '$get':18 , '$lte':30 } } );
‘$in’ 一個鍵對應多個值
‘$nin’ 同上取反, 一個鍵不對應指定值
「$or」 多個條件匹配, 能夠嵌套 $in 使用
「$not」 同上取反, 查詢與特定模式不匹配的文檔
// 查詢 age等於20或21或21或’haha’的文檔 Model.find({'age':{ '$in':[20,21,22.'haha']} } ); // 查詢 age等於18 或 name等於’xueyou’ 的文檔 Model.find({'$or' : [ {'age':18} , {'name':'xueyou'} ] });
"$exists" 是否存在某屬性
null 能匹配自身和不存在的值, 想要匹配鍵的值爲null, 就要經過 「$exists」 條件斷定鍵值已經存在
// 查詢 age值爲null的文檔 Model.find('age' : { '$in' : [null] , 'exists' : true } ); //查詢全部存在name屬性的文檔 Model.find({name: {$exists: true}}); //查詢全部不存在telephone屬性的文檔 Model.find({telephone: {$exists: false}});
MongoDb 使用 Prel兼容的正則表達式庫來匹配正則表達式
// 查詢name爲 joe 的文檔, 並忽略大小寫 Model.find( {'name' : /joe/i } ) //查詢匹配各類大小寫組合 Model.find( {'name' : /joe?/i } )
‘$all’ 匹配數組中多個元素
‘$size’ 匹配數組長度
‘$slice’ 查詢子集合返回
// 查詢 array(數組類型)鍵中有10的文檔, array : [1,2,3,4,5,10] 會匹配到 Model.find({'array':10} ); //查詢 array(數組類型)鍵中下標5對應的值是10, array : [1,2,3,4,5,10] 會匹配到 Model.find({'array[5]':10} ); //查詢 匹配array數組中 既有5又有10的文檔 Model.find({'array':[5,10]} ); // 查詢 匹配array數組長度爲3 的文檔 Model.find({'array':{'$size' : 3} } ); // 查詢 匹配array數組的前10個元素 Model.find({'array':{'$skice' : 10} } ); //查詢 匹配array數組的第5個到第10個元素 Model.find({'array':{'$skice' : [5,10] } } );
用$where能夠執行任意javacript語句做爲查詢的一部分,若是回調函數返回 true 文檔就做爲結果的一部分返回
Model.find({"$where": function() { if (this.x !== null && this.y !== null) { return this.x + this.y === 10 ? true : false; // retrun將替代返回結果 } else { return true; } } }) Model.find( {"$where" : "this.x + this.y === 10" } ) // this指向Model Model.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )
要實現聯表查詢須要將鏈接的Model的主鍵_id指向須要對應Model的某個屬性上。使用populate進行查詢
實現方法以下:
// *****************建立Model************ var cityModel= mongoose.model('city', { cityName: String, townList: [] }); var countryModel = mongoose.model('country', { country: String, cityList:[{ type: mongoose.Schema.ObjectId, ref: 'city' // 將'sity'Model的主鍵與country的cityList對應 }] }); // ****************插入數據************************ cityModel.create({cityName:'shanghai',townList:['lujiazui']}); cityModel.create({cityName:'guangzhou',townList:['tianhe']}); cityModel.create({cityName:'beijing',townList:['zhaoyang']}); var countryObj = { country:'china', cityList:[] } cityModel.find().then(res=>{ //將全部數據查出,並將對應的_id存入數組 for(let i in res){ countryObj.cityList.push(res[i]._id); } // 插入國家數據 countryModel.create(countryObj,function(err,res){ console.log(err); console.log('res' + res); }); }); // ****************查詢結果********************** countryModel.find().then(res=>{ // 普通查詢 console.log(res); }).catch(err=>{ console.log(err); }) /*結果爲 [ { cityList: [ 5a4ded2b78110500d8b94726, 5a4ded2b78110500d8b94725, 5a4ded2b78110500d8b94727 ], _id: 5a4df149c249713348a2f546, country: 'china', __v: 0 } ] */ countryModel.find({country: 'china'}).populate('cityList').then(res=>{ // populate查詢 console.log(res); }) /* [ { cityList: [ [Object], [Object], [Object] ], _id: 5a4df149c249713348a2f546, country: 'china', __v: 0 } ] */
limit(3) 限制返回結果的數量
skip(3) 跳過前3個文檔,返回其他的
sort( 'username':1 , 'age':-1 } ) 排序 鍵對應文檔的鍵名, 值表明排序方向, 1 升序, -1降序
‘$inc’ 增減修改器,只對數字有效.下面的實例: 找到 age=22的文檔,修改文檔的age值自增1
Model.update({'age':22}, {'$inc':{'age':1}});
‘$set’ 指定一個鍵的值,這個鍵不存在就建立它.能夠是任何MondoDB支持的類型.
Model.update({'age':22}, {'$set':{'age':'haha'}});
‘$unset’ 刪除一個鍵
Model.update({‘age’:22}, {’$unset’:{‘age’:‘haha’} } );
‘$push’ 給一個鍵push一個數組成員,鍵不存在會建立
Model.update({'age':22}, {'$push':{'array':10} } );
‘$addToSet’ 向數組中添加一個元素,若是存在就不添加
Model.update({'age':22}, {'$addToSet':{'array':10} } );
‘$each’ 遍歷數組, 和 $push 修改器配合能夠插入多個值
Model.update({'age':22}, {'$push':{'array':{'$each': [1,2,3,4,5]}} } );
‘$pop’ 向數組中尾部刪除一個元素
Model.update({'age':22}, {'$pop':{'array':1} } );
‘$pull’ 向數組中刪除指定元素
Model.update({'age':22}, {'$pull':{'array':10} } );
Model.remove(conditions,callback); // conditions爲查詢條件,可參考find