Queries 查询 - 图1mongoose

Queries 查询 - 图2mongoose

Queries 查询

Model 的多个静态辅助方法都可以查询文档。

Model 的方法中包含查询条件参数的( find findById count update )都可以按以下两种方式执行:

  • 传入 callback 参数,操作会被立即执行,查询结果被传给回调函数( callback )。
  • 不传 callback 参数,Query 的一个实例(一个 query 对象)被返回,这个 query 提供了构建查询器的特殊接口。

Query 实例有一个 .then() 函数,用法类似 promise。

如果执行查询时传入 callback 参数,就需要用 JSON 文档的格式指定查询条件。JSON 文档的语法跟 MongoDB shell 一致。

  1. var Person = mongoose.model('Person', yourSchema);
  2. // 查询每个 last name 是 'Ghost' 的 person, select `name` 和 `occupation` 字段
  3. Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) {
  4. if (err) return handleError(err);
  5. // Prints "Space Ghost is a talk show host".
  6. console.log('%s %s is a %s.', person.name.first, person.name.last,
  7. person.occupation);
  8. });

上例中查询被立即执行,查询结果被传给回调函数。Mongoose 中所有的回调函数都使用 callback(error, result) 这种模式。如果查询时发生错误,error 参数即是错误文档, result 参数会是 null。如果查询成功,error 参数是 null,result 即是查询的结果。

Mongoose 中每一处查询,被传入的回调函数都遵循 callback(error, result) 这种模式。查询结果的格式取决于做什么操作: findOne() 是单个文档(有可能是 null ),find() 是文档列表, count() 是文档数量,update() 是被修改的文档数量。 Models API 文档中有详细描述被传给回调函数的值。

下面来看不传入 callback 这个参数会怎样:

  1. // 查询每个 last name 是 'Ghost' 的 person
  2. var query = Person.findOne({ 'name.last': 'Ghost' });
  3. // select `name` 和 `occupation` 字段
  4. query.select('name occupation');
  5. // 然后执行查询
  6. query.exec(function (err, person) {
  7. if (err) return handleError(err);
  8. // Prints "Space Ghost is a talk show host."
  9. console.log('%s %s is a %s.', person.name.first, person.name.last,
  10. person.occupation);
  11. });

以上代码中,query 是个 Query 类型的变量。 Query 能够用链式语法构建查询器,无需指定 JSON 对象。 下面2个示例等效。

  1. // With a JSON doc
  2. Person.
  3. find({
  4. occupation: /host/,
  5. 'name.last': 'Ghost',
  6. age: { $gt: 17, $lt: 66 },
  7. likes: { $in: ['vaporizing', 'talking'] }
  8. }).
  9. limit(10).
  10. sort({ occupation: -1 }).
  11. select({ name: 1, occupation: 1 }).
  12. exec(callback);
  13. // Using query builder
  14. Person.
  15. find({ occupation: /host/ }).
  16. where('name.last').equals('Ghost').
  17. where('age').gt(17).lt(66).
  18. where('likes').in(['vaporizing', 'talking']).
  19. limit(10).
  20. sort('-occupation').
  21. select('name occupation').
  22. exec(callback);

Query API 文档中有查询函数的完整列表。

引用其他文档

MongoDB 中没有表连接,但引用其他集合的文档有时也会需要。Population 即为此而生。 这里 有关于从其他集合引用文档的更多内容。

Streaming

你可以流式( stream )处理 MongoDB 的查询结果,需要调用 Query.cursor() 函数获得 QueryCursor 的一个实例。

  1. var cursor = Person.find({ occupation: /host/ }).cursor();
  2. cursor.on('data', function(doc) {
  3. // Called once for every document
  4. });
  5. cursor.on('close', function() {
  6. // Called when done
  7. });

下一步

现在我们介绍过了 Queries,接下来开始 Validation