開始以前,沒什麼比過一遍官方文檔更有必要的了:http://mongoosejs.com/html
mongoose 是啥?有啥用?
mongoose 是操做 MongoDB 的一個對象模型庫;它封裝了MongoDB對文檔操做的經常使用處理方法(增刪改查),讓 NodeJS 操做 Mongodb 數據庫變得快捷靈活。vue
本文所用到的完整代碼:源碼node
新建目錄 s4_mongoose 和 test.js 文件:git
mkdir s4_mongoose cd s4_mongoose touch test.js
初始化目錄生成 package.json 並安裝 mongoose:github
npm init cnpm install mongoose --save
編輯 test.js :mongodb
var mongoose = require('mongoose'); var db = mongoose.connect('mongodb://127.0.0.1:27017/test'); db.connection.on('error', function(error){ console.log('數據庫test鏈接失敗:' + error); }); db.connection.on('open', function(){ console.log('數據庫test鏈接成功'); });
接着先打開一個 iTerm2 終端,開啓 mongodb 服務:數據庫
mongod
再打開另外一個 iTerm2 終端,運行 test.js:npm
node test.js //成功後便會輸出:數據庫test鏈接成功
沒有比文檔更詳細的了:http://mongoosejs.com/docs/guide.htmljson
Schema:數據庫集合的結構對象。數組
Model :由Schema構造而成,可操做數據庫。
Entity:由Model建立的實體,可操做數據庫。
看完文檔後,再看看下面一段代碼配合理解一下:
var mongoose = require("mongoose"); var db = mongoose.connect("mongodb://127.0.0.1:27017/test"); // var testModel = db.model('test1', testSchema); // 集合名稱;集合的結構對象 var TestSchema = new mongoose.Schema({ name : { type:String }, age : { type:Number, default:0 }, email: { type:String }, time : { type:Date, default:Date.now } }); var TestModel = db.model("test1", TestSchema ); var TestEntity = new TestModel({ name : "helloworld", age : 28, email: "helloworld@qq.com" }); TestEntity.save(function(error,doc){ if(error){ console.log("error :" + error); }else{ console.log(doc); } });
在前面的數據庫鏈接成功的前提下,咱們在數據庫 test 下新建一個集合 test1
、並往裏面插入保存一組數據:
var testSchema = new mongoose.Schema({ name: {type: String}, age: {type: Number, default: 0}, email: {type: String}, time: {type: Date, default: Date.now} }); var testModel = db.model('test1', testSchema); // 集合名稱;集合的結構對象 // Document文檔(關聯數組式的對象) < Collection集合 < 數據庫 // 插入保存一段數據 testModel.create([ {name: "test1", age: 8}, {name: "test2", age: 18}, {name: "test3", age: 28}, {name: "test4", age: 38}, {name: "test5", age: 48}, {name: "test6", age: 58, email:"tttt@qq.com"}, {name: "test7", age: 68, email:"ssss@qq.com"}, {name: "test8", age: 18}, {name: "test9", age: 18, email:"rrrr@qq.com"}, {name: "test10",age: 18} ], function (error, docs) { if(error) { console.log(error); } else { console.log('save ok'); console.log(docs); } });
mongoose 提供了find、findOne、和findById方法用於文檔查詢。
基本語法:
model.find(Conditions,fields,options,callback(err, doc));
Conditions: 查詢條件
fields: 返回的字段
options: 遊標(sort,limit)
callback: 回調函數,參數doc爲查詢出來的結果
條件查詢的基礎:$lt
(小於<)$lte
(小於等於<=)$gt
(大於>)$gte
(大於等於>=)$ne
(不等於,不包含!=)$in
(包含)$or
(查詢多個鍵值的任意給定值)$exists
(判斷某些屬性是否存在)$all
(所有)
具體的一些實例,代碼裏已有詳細註釋:
// find(Conditions,fields,callback); // 省略或爲空、返回全部記錄;只包含name,age字段,去掉默認的_id字段;執行回調函數 testModel.find({}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('{}查詢結果爲:'); console.log(docs); } }); // 查詢age大於等於28,小於等於48 testModel.find({age: {$gte: 28, $lte: 48}}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('$gte,$lte查詢結果爲:'); console.log(docs); } }); // 查詢age爲5八、68的2條數據 testModel.find({age: {$in: [58, 68]}}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('$in查詢結果爲:'); console.log(docs); } }); // 查詢name爲test三、或者age爲18的所有數據 testModel.find({$or: [{name: 'test3'}, {age: 18}]}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('$or查詢結果爲:'); console.log(docs); } }); // step3:遊標查詢 // 查詢name爲test三、或者age爲18的所有數據;但限制只查詢2條數據 testModel.find({$or: [{name: 'test3'}, {age: 18}]}, {name:1, age:1, _id:0}, {limit: 2}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('limit查詢結果爲:'); console.log(docs); } });
基本使用:model.update(查詢條件,更新對象,callback);
var conditions = {name: 'test1'}; var update = {$set: {age: 11 }}; testModel.update(conditions, update, function(error){ if(error) { console.log(error); } else { console.log('Update success!'); testModel.find({name: 'test1'}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('更新test1後的查詢結果爲:'); console.log(docs); // 更新test_update後的查詢結果爲空數組:[ ]; // 更新test1後的查詢結果爲: [ { name: 'test1', age: 11 } ] // 只能更新原本已存在的數據 } }); } });
基本使用:model.remove(查詢條件,callback);
var conditions = {name: 'test2'}; testModel.remove(conditions, function(error){ if(error) { console.log(error); } else { console.log('Delete success!'); testModel.find({name: 'test2'}, {name:1, age:1, _id:0}, function(err, docs){ if (err) { console.log('查詢出錯:' + err); } else { console.log('刪除test2後的查詢結果爲:'); console.log(docs); // 刪除test2後的查詢結果爲空數組:[ ]; } }); } });
安裝 mongodb 可視化工具 robomongo
在 iTerm2 開啓本地mongodb後(執行mongod
),打開 robomongo,新建 connection 便可連上本地的 mongodb 數據庫。