假設(shè)以下代碼都運行在
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
let db = mongoose.connection;
db.on('error', () => {
console.error('鏈接失敗');
});
db.once('open', function () {
//下面講到的所有代碼都在這里運行
});
Queries
文檔可以通過模型的幾個靜態(tài)輔助方法檢索。
涉及指定查詢條件的任何模型方法可以以兩種方式執(zhí)行:
當(dāng)一個回調(diào)函數(shù):
被傳遞,操作將立即執(zhí)行,結(jié)果傳遞到回調(diào)函數(shù)。
-
不傳遞敢会,則返回一個Query實例,為您提供一個特殊的QueryBuilder接口这嚣。
讓我們來看看當(dāng)傳遞回調(diào)時會發(fā)生什么:let Schema = mongoose.Schema; let schema = new Schema({ name:String, age:Number, occupation:String }); let Person = mongoose.model('Person',schema); let man = new Person({ name:'noshower', age:22, occupation:'teacher' }); man.save(function(err,man){ if(err){ return console.error(err); } console.log(man);// { __v: 0,name: 'noshower',age: 22,occupation: 'teacher',_id: 587a0234a693c31ed46c4885 } // 查找名叫‘noshower'的人鸥昏,選擇“名字”和“職業(yè)”字段 Person.findOne({"name":"noshower"},'name occupation',function(err,man){ console.log(man);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower', occupation: 'teacher' } }); });
這里我們看到查詢立即執(zhí)行,結(jié)果傳遞給我們的回調(diào)姐帚。 Mongoose中的所有回調(diào)都使用模式:callback(error互广,result)。如果執(zhí)行查詢時發(fā)生錯誤卧土,則error參數(shù)將包含錯誤文檔,結(jié)果將為null像樊。如果查詢成功尤莺,error參數(shù)將為null,并且result將填充查詢的結(jié)果生棍。
任何地方回調(diào)被傳遞到Mongoose中的查詢颤霎,回調(diào)函數(shù)都遵循這個模式callback(err,result)涂滴。result取決于操作:對于findOne()友酱,它是一個單個文檔,對于find()它是文檔列表柔纵,對于count()它是文檔數(shù)缔杉,對于update()它是受影響的文檔數(shù)等等。
現(xiàn)在讓我們看看當(dāng)沒有回調(diào)被傳遞時會發(fā)生什么:
let Schema = mongoose.Schema;
let schema = new Schema({
name:String,
age:Number,
occupation:String
});
let Person = mongoose.model('Person',schema);
//找出一條名叫"noshower"的文檔
let query = Person.findOne({name:'noshower'});
//選擇"name""occupation"字段
query.select('name occupation');
//稍后執(zhí)行查詢
query.exec(function(err,person){
if(err){
return console.error(err);
}
console.log(person);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower', occupation: 'teacher' }
});