db.collection.find()
在本页面
db.collection.
find
(查询,投影)- 选择集合或视图中的文档,并将光标返回到所选文档。
参数 | 类型 | 描述 |
---|---|---|
query | document | 可选的。使用query operators指定选择过滤器。要 return 集合中的所有文档,请省略此参数或传递空文档( {} )。 |
projection | document | 可选的。指定_retch 查询过滤器的文档中的 return 字段。要_retret 匹配文档中的所有字段,请省略此参数。有关详细信息,请参阅投影。 |
返回: | 与匹配 query 标准的文档。当find()方法“返回文档”时,该方法实际上是将光标返回到文档。 |
projection
参数确定匹配文档中返回的字段。 projection
参数采用以下形式的文档:{ field1: <value>, field2: <value> ... }
<value>
可以是以下任何一种:1
或true
在 return 文档中包含该字段。0
或false
排除该字段。- 表达式使用投影操作员。find()视图操作不支持以下投影 operators:
- $
- $elemMatch
- $slice
- $meta注意对于
_id
字段,您不必明确指定_id: 1
来_return_id
字段。除非指定_id: 0
以禁止字段,否则find()方法始终返回_id字段。
除了排除
_id
字段外,projection
不能同时包含 include 和 exclude 规范。在明确包含字段的投影中,_id
字段是您可以显式排除的唯一字段。在mongo shell 中执行db.collection.find()会自动迭代光标以显示前 20 个文档。键入
it
以继续迭代。要使用驱动程序访问返回的文档,请使用适当的司机语言光标处理机制。
也可以看 看
迭代返回的游标 修改光标行为 可用的mongo Shell游标方法
要为db.collection.find()指定阅读关注,请使用cursor.readConcern()方法。
MongoDB 将某些数据类型视为等效用于比较目的。例如,数字类型在比较之前进行转换。但是,对于大多数数据类型,比较 operators仅对目标字段的BSON 类型与查询操作数的类型匹配的文档执行比较。考虑以下集合:
{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }
{ "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } }
{ "_id": "avocados", "qty": "fourteen" }
以下查询使用$gt来 return
qty
的 value 大于4
的文档。db.collection.find( { qty: { $gt: 4 } } )
该查询返回以下文档:
{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }
不返回
_id
等于"avocados"
的文档,因为qty
value 的类型为string
而$gt操作数的类型为integer
。不返回
_id
等于"oranges"
的文档,因为其qty
value 的类型为object
。注意要在集合中强制执行数据类型,请使用Schema 验证。
版本4.0中的新功能。
对于在会话内创建的游标,不能
getMore
在会话外调用 。同样,对于在会话外部创建的游标,不能
getMore
在会话内部调用 。从MongoDB 3.6开始,MongoDB驱动程序和
mongo
shell程序将所有操作与服务器会话相关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()
),MongoDB驱动程序和mongo
外壳程序会创建一个隐式会话并将其与该操作相关联。如果会话空闲时间超过30分钟,则MongoDB服务器会将会话标记为已过期,并可以随时关闭它。当MongoDB服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置了30分钟
noCursorTimeout
或maxTimeMS
30分钟以上的光标。对于可能闲置超过30分钟的操作,请使用将该操作与显式会话相关联,
Session.startSession()
并使用该refreshSessions
命令定期刷新该会话。请参阅以获取更多信息。Session Idle Timeout
db.collection.find()
可以在多文档交易中使用 。- 对于在事务外部创建的游标,不能
getMore
在事务内部调用 。 - 对于在事务中创建的游标,不能
getMore
在事务外部调用 。
重要在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应替代有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。也就是说,在许多情况下,适当地对数据建模将最大程度地减少对多文档交易的需求。有关其他事务使用方面的注意事项(例如运行时限制和操作日志大小限制),另请参见 生产注意事项。
从MongoDB 4.2开始,如果发出
db.collection.find()
断开连接的客户端在操作完成之前断开连接,则MongoDB将标记db.collection.find()
为终止(即killOp
在操作上)。本节中的示例使用bios 集合中的文档,其中文档通常具有以下形式:
{
"_id" : <value>,
"name" : { "first" : <string>, "last" : <string> }, // embedded document
"birth" : <ISODate>,
"death" : <ISODate>,
"contribs" : [ <string>, ... ], // Array of Strings
"awards" : [
{ "award" : <string>, year: <number>, by: <string> } // Array of embedded documents
...
]
}
要创建和填充
bios
集合,请参阅bios Example Collection。没有参数的find()方法返回集合中的所有文档,并返回文档的所有字段。对于 example,以下操作返回bios 系列中的所有文档:
db.bios.find()
- 以下操作返回bios 系列中
_id
等于5
的文档:db.bios.find( { _id: 5 } ) - 以下操作返回bios 系列中的文档,其中
name
嵌入文档中的字段last
等于"Hopper"
:db.bios.find( { "name.last": "Hopper" } )注意要访问嵌入文档中的字段,请使用点符号("<embedded document>.<field>"
)。
要查找匹配一组选择条件的文档,请使用
<criteria>
参数调用find()。MongoDB 提供各种query operators来指定标准。
- 以下操作使用$in operator return bios 系列中的文档,其中
_id
等于5
或ObjectId("507c35dd8fada716c89d0013")
:db.bios.find({ _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }) - 以下操作使用$gt operator 返回
bios
集合中birth
大于new Date('1950-01-01')
的所有文档:db.bios.find( { birth: { $gt: new Date('1950-01-01') } } ) - 以下操作使用$regex operator return bios 系列中的文档,其中
name.last
字段以字母N
(或"LIKE N%"
)开头db.bios.find({ "name.last": { $regex: /^N/ } })
有关查询 operators 的列表,请参阅查询 Selectors。
组合比较 operators 以指定字段的范围。以下操作从bios 系列文档返回,其中
birth
介于new Date('1940-01-01')
和new Date('1960-01-01')