OPTIONS
翻译或纠错本页面

读操作概述

读操作,或者说 queries ,从数据库中检索存储的数据。在 MongoDB 里,查询从一个独立的集合中选择 documents

查询指定识别 MongoDB 返回给客户端的条件。查询可以包含一个指定匹配文档中返回的字段的 映射 。映射限制了 MongoDB 通过网络返回给客户端的数据量。

查询接口

对于查询操作,MongoDB 提供了 db.collection.find() 方法。这个方法接收查询条件和映射两个条件并且返回一个指向匹配文档的 游标 。你可以使用 limits, skip 和 sort orders 来有选择的修饰查询。

下图把 MongoDB 查询操作组成部分进行了高亮显示:

The components of a MongoDB find operation.

The components of a MongoDB find operation.

下图展示了使用 SQL 的相同查询:

The components of a SQL SELECT statement.

The components of a SQL SELECT statement.

例子

db.users.find( { age: { $gt: 18 } }, { name: 1, address: 1 } ).limit(5)

这查询从 user 集合中选择符合条件 age 大于 18 的文档。为了指定大于条件,查询条件使用大于(也就是 $gtquery selection operator 。这个查询最多返回 5 个匹配的文档(或者更准确的说,一个指向这些文档的游标)。这些匹配的文档将仅仅返回 _idnameaddress 字段。详细信息,请参阅 映射

参阅:

SQL到MongoDB映射表 for additional examples of MongoDB queries and the corresponding SQL statements.

查询行为

MongoDB 查询表现出以下行为:

  • 在 MongoDB 中,所有的查询都处理 单个 集合。

  • 你可以使用 limitsskipssort orders 来修饰查询。

  • 如果你未指定 sort() ,那么通过查询返回的文档顺序是未定义的。

  • :doc:` 修改存在的文档 </tutorial/modify-documents>` 操作(例如 updates)使用相同的查询语法作为查询条件来选择要更新的文档。

  • 在 :doc:` 聚合 </core/aggregation>` 管道中, $match 管道阶段提供通向 MongoDB 查询的途径。

MongoDB 提供了 db.collection.findOne() 作为 find() 方法的一个特例,它只返回一个文档。

查询声明

请看下面指定了查询条件和排序修饰符的查询过程的图表:

The stages of a MongoDB query with a query criteria and a sort modifier.

The stages of a MongoDB query with a query criteria and a sort modifier.

在上图表里,这个查询从 users 集合中选择文档。使用 query selection operator 来定义匹配文档的条件,该查询选择 年龄 大于(也就是 $gt18 的文档。然后 sort() 修饰符以 age 的升序来对结果进行排序。

要获取更多的查询示例,请参阅 查询文档

映射

在 MongoDB 里,查询默认返回所有匹配文档里的全部字段。想要限制 MongoDB 发送给应用的数据量,可以在查询里包含 projection 。通过映射包含字段子集的结果,应用可以降低他们的网络开销并且处理需求。

映射,它是 find() 方法的 第二个 参数,既可以指定结果文档里要返回的字段列表, 可以指定不包含的字段列表

重要

除了在包含映射里排除 _id 字段以外,你不能把不包含映射和包含映射混在一起。

请看下面的指定查询条件和映射的查询过程图:

The stages of a MongoDB query with a query criteria and projection. MongoDB only transmits the projected data to the clients.

The stages of a MongoDB query with a query criteria and projection. MongoDB only transmits the projected data to the clients.

在上图里,这个查询从 users 集合中选择文档。条件匹配 年龄 等于 18 的文档。然后映射指定在匹配文档里仅仅 name 字段应该返回。

映射示例

从结果集中排除一个字段

db.records.find( { "user_id": { $lt: 42 } }, { "history": 0 } )

此查询从 records 集合里选择匹配条件 { "user_id": { $lt: 42 } } 的文档,并且使用映射 { "history": 0 } 从结果集文档里排除 history 字段。

返回两个字段 以及 _id 字段

db.records.find( { "user_id": { $lt: 42 } }, { "name": 1, "email": 1 } )

此查询从 records 集合里选择匹配条件 { "user_id": { $lt: 42 } } 的文档,并且为了在结果集的文档里仅仅返回 _id 字段(隐式地包含), name 字段以及 email 字段使用了映射 { "name": 1, "email": 1 }

返回两个字段 并且 不包含 _id

db.records.find( { "user_id": { $lt: 42} }, { "_id": 0, "name": 1 , "email": 1 } )

此查询从 records 集合里选择匹配条件 { "user_id": { $lt: 42 } } 的文档,并且在结果集文档里仅仅返回 nameemail 字段。

参阅:

限制查询返回的字段 for more examples of queries with projection statements.

映射行为

MongoDB 映射有下列属性:

  • 默认情况下,在结果集里包含 _id 字段。想要在结果集里压制 _id 字段,请在映射文档里指定 _id: 0

  • 对于包含数组的字段,MongoDB 提供了下列的映射操作符:$elemMatch$slice$

  • 对于 aggregation framework 管道里的有关的映射功能,使用 $project 管道阶段。

←   读操作 Cursors  →