查询 (queries)
Model 的多个静态辅助方法都可以查询文档。
Model 的方法中包含查询条件参数的( find findById count update )都可以按以下两种方式执行:
- 传入
callback
参数,操作会被立即执行,查询结果被传给回调函数( callback )。 - 不传
callback
参数,Query 的一个实例(一个 query 对象)被返回,这个 query 提供了构建查询器的特殊接口。
Query 实例有一个 .then()
函数,用法类似 promise。
如果执行查询时传入 callback
参数,就需要用 JSON 文档的格式指定查询条件。JSON 文档的语法跟 MongoDB shell 一致。
var Person = mongoose.model('Person', yourSchema);
// 查询每个 last name 是 'Ghost' 的 person, select `name` 和 `occupation` 字段
Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) {
if (err) return handleError(err);
// Prints "Space Ghost is a talk show host".
console.log('%s %s is a %s.', person.name.first, person.name.last,
person.occupation);
});
上例中查询被立即执行,查询结果被传给回调函数。Mongoose 中所有的回调函数都使用 callback(error, result)
这种模式。如果查询时发生错误,error
参数即是错误文档, result
参数会是 null。如果查询成功,error
参数是 null,result
即是查询的结果。
Mongoose 中每一处查询,被传入的回调函数都遵循 callback(error, result)
这种模式。查询结果的格式取决于做什么操作: findOne() 是单个文档(有可能是 null ),find() 是文档列表, count() 是文档数量,update() 是被修改的文档数量。 Models API 文档中有详细描述被传给回调函数的值。
下面来看不传入 callback
这个参数会怎样:
// 查询每个 last name 是 'Ghost' 的 person
var query = Person.findOne({ 'name.last': 'Ghost' });
// select `name` 和 `occupation` 字段
query.select('name occupation');
// 然后执行查询
query.exec(function (err, person) {
if (err) return handleError(err);
// Prints "Space Ghost is a talk show host."
console.log('%s %s is a %s.', person.name.first, person.name.last,
person.occupation);
});
以上代码中,query
是个 Query 类型的变量。 Query
能够用链式语法构建查询器,无需指定 JSON 对象。 下面2个示例等效。
// With a JSON doc
Person.
find({
occupation: /host/,
'name.last': 'Ghost',
age: { $gt: 17, $lt: 66 },
likes: { $in: ['vaporizing', 'talking'] }
}).
limit(10).
sort({ occupation: -1 }).
select({ name: 1, occupation: 1 }).
exec(callback);
// Using query builder
Person.
find({ occupation: /host/ }).
where('name.last').equals('Ghost').
where('age').gt(17).lt(66).
where('likes').in(['vaporizing', 'talking']).
limit(10).
sort('-occupation').
select('name occupation').
exec(callback);
Query API 文档中有查询函数的完整列表。
引用其他文档
MongoDB 中没有表连接,但引用其他集合的文档有时也会需要。Population 即为此而生。 这里 有关于从其他集合引用文档的更多内容。
Streaming
你可以流式( stream )处理 MongoDB 的查询结果,需要调用 Query.cursor() 函数获得 QueryCursor 的一个实例。
var cursor = Person.find({ occupation: /host/ }).cursor();
cursor.on('data', function(doc) {
// Called once for every document
});
cursor.on('close', function() {
// Called when done
});
下一步
现在我们介绍过了 Queries,接下来开始 Validation。