假设以下代码都运行在
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
let db = mongoose.connection;
db.on('error', () => {
console.error('链接失败');
});
db.once('open', function () {
//下面讲到的所有代码都在这里运行
});
Queries
文档可以通过模型的几个静态辅助方法检索。
涉及指定查询条件的任何模型方法可以以两种方式执行:
当一个回调函数:
被传递,操作将立即执行,结果传递到回调函数。
-
不传递,则返回一个Query实例,为您提供一个特殊的QueryBuilder接口。
让我们来看看当传递回调时会发生什么: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'的人,选择“名字”和“职业”字段 Person.findOne({"name":"noshower"},'name occupation',function(err,man){ console.log(man);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower', occupation: 'teacher' } }); });
这里我们看到查询立即执行,结果传递给我们的回调。 Mongoose中的所有回调都使用模式:callback(error,result)。如果执行查询时发生错误,则error参数将包含错误文档,结果将为null。如果查询成功,error参数将为null,并且result将填充查询的结果。
任何地方回调被传递到Mongoose中的查询,回调函数都遵循这个模式callback(err,result)。result取决于操作:对于findOne(),它是一个单个文档,对于find()它是文档列表,对于count()它是文档数,对于update()它是受影响的文档数等等。
现在让我们看看当没有回调被传递时会发生什么:
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');
//稍后执行查询
query.exec(function(err,person){
if(err){
return console.error(err);
}
console.log(person);//{ _id: 587a02251d73bb1ec61ace04, name: 'noshower', occupation: 'teacher' }
});