On this page
db.collection.find()
在本页面
Definition
db.collection.
find
(* query , projection *)- 在集合或视图中选择文档,并向所选文档返回cursor。
Parameter | Type | Description |
---|---|---|
query |
document | 可选的。使用query operators指定选择过滤器。要返回集合中的所有文档,请省略此参数或传递一个空文档({} )。 |
projection |
document | 可选的。指定要在与查询过滤器匹配的文档中返回的字段。要返回匹配文档中的所有字段,请省略此参数。有关详细信息,请参见Projection。 |
Behavior
Projection
projection
参数确定在匹配文档中返回哪些字段。 projection
参数采用以下格式的文档:
{ field1: <value>, field2: <value> ... }
<value>
可以是以下任意一个:
1
或true
将字段包含在return文档中。0
或false
以排除该字段。使用Projection Operators表示。
视图上的find()操作不支持以下projection运算符:
projection
不能包含包含和排除两个规范,除了_id
字段除外。在明确包含字段的投影中,_id
字段是唯一可以明确排除的字段。
Cursor Handling
在mongo shell 中执行db.collection.find()会自动迭代光标以显示最多前 20 个文档。键入it
continue 迭代。
要使用驱动程序访问返回的文档,请对driver language使用适当的光标处理机制。
See also
Read Concern
要为db.collection.find()指定read concern,请使用cursor.readConcern()方法。
Type Bracketing
为了进行比较,MongoDB 将某些数据类型视为等效。例如,数字类型在比较之前先进行转换。但是,对于大多数数据类型,comparison operators仅对目标字段BSON type与查询操作数的类型匹配的文档执行比较。考虑以下集合:
{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }
{ "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } }
{ "_id": "avocados", "qty": "fourteen" }
以下查询使用$gt返回qty
的值大于4
的文档。
db.collection.find( { qty: { $gt: 4 } } )
该查询返回以下文档:
{ "_id": "apples", "qty": 5 }
{ "_id": "bananas", "qty": 7 }
_id
等于"avocados"
的文档不会返回,因为其qty
值为string
类型,而$gt操作数为integer
类型。
_id
等于"oranges"
的文档不会返回,因为其qty
值为object
类型。
Note
要在集合中强制使用数据类型,请使用Schema Validation。
会话空闲超时
从 MongoDB 3.6 开始,MongoDB 驱动程序和mongo shell 将所有操作与server session关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB 驱动程序和mongo
Shell 创建隐式会话并将其与该操作相关联。
如果会话空闲时间超过 30 分钟,则 MongoDB 服务器会将会话标记为已过期,并可以随时关闭它。当 MongoDB 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeout或maxTimeMS大于 30 分钟的光标。
对于可能闲置超过 30 分钟的操作,请使用Session.startSession()
将操作与显式会话相关联,并使用refreshSessions命令定期刷新该会话。有关更多信息,请参见会话空闲超时。
Examples
本节中的示例使用bios collection中的文档,这些文档通常采用以下格式:
{
"_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 示例集。
查找集合中的所有文档
没有参数的find()方法返回集合中的所有文档,并返回文档的所有字段。例如,以下操作返回bios collection中的所有文档:
db.bios.find()
查找符合查询条件的文档
平等查询
- 以下操作返回bios collection中的文档,其中
_id
等于5
:
db.bios.find( { _id: 5 } )
- 以下操作返回bios collection中的文档,其中
name
嵌入文档中的字段last
等于"Hopper"
:
db.bios.find( { "name.last": "Hopper" } )
Note
要访问嵌入式文档中的字段,请使用dot notation("<embedded document>.<field>"
)。
使用运算符查询
要查找符合一组选择标准的文档,请使用<criteria>
参数调用find()。
MongoDB 提供了各种query operators来指定条件。
- 以下操作使用$in运算符返回bios collection中的文档,其中
_id
等于5
或ObjectId("507c35dd8fada716c89d0013")
:
db.bios.find(
{ _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
)
- 以下操作使用$gt运算符返回
bios
集合中birth
大于new Date('1950-01-01')
的所有文档:
db.bios.find( { birth: { $gt: new Date('1950-01-01') } } )
- 以下操作使用$regex运算符返回bios collection中的文档,其中
name.last
字段以字母N
开头(或为"LIKE N%"
)
db.bios.find(
{ "name.last": { $regex: /^N/ } }
)
有关查询运算符的列表,请参见Query Selectors。
查询范围
组合比较运算符以指定字段的范围。以下操作从bios collection文档返回,其中birth
在new Date('1940-01-01')
和new Date('1960-01-01')
之间(不包括):
db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } )
有关查询运算符的列表,请参见Query Selectors。
查询多个条件
以下操作从bios collection返回所有文档,其中birth
字段是greater than new Date('1950-01-01')
而death
字段不存在:
db.bios.find( {
birth: { $gt: new Date('1920-01-01') },
death: { $exists: false }
} )
有关查询运算符的列表,请参见Query Selectors。
查询嵌入式文档
以下示例查询bios collection中的name
嵌入式字段。
查询嵌入文档的完全匹配
以下操作返回bios collection中的文档,其中嵌入文档name
是完全 { first: "Yukihiro", last: "Matsumoto" }
,包括 Sequences:
db.bios.find(
{ name: { first: "Yukihiro", last: "Matsumoto" } }
)
name
字段必须与嵌入的文档完全匹配。该查询不**匹配具有以下name
字段的文档:
{
first: "Yukihiro",
aka: "Matz",
last: "Matsumoto"
}
{
last: "Matsumoto",
first: "Yukihiro"
}
嵌入式文档的查询字段
以下操作返回bios collection中的文档,其中嵌入式文档name
包含值为"Yukihiro"
的字段first
和值为"Matsumoto"
的字段last
。该查询使用dot notation来访问嵌入式文档中的字段:
db.bios.find(
{
"name.first": "Yukihiro",
"name.last": "Matsumoto"
}
)
该查询与name
字段包含嵌入文档的文档匹配,该文档的嵌入字段first
的值为"Yukihiro"
,而字段last
的值为"Matsumoto"
。例如,查询将匹配具有name
字段且包含以下任一值的文档:
{
first: "Yukihiro",
aka: "Matz",
last: "Matsumoto"
}
{
last: "Matsumoto",
first: "Yukihiro"
}
有关更多信息和示例,另请参见查询嵌入/嵌套文档。
Query Arrays
查询数组元素
以下示例查询bios collection中的contribs
数组。
- 以下操作返回bios collection中的文档,其中数组字段
contribs
包含元素"UNIX"
:
db.bios.find( { contribs: "UNIX" } )
- 以下操作返回bios collection中的文档,其中数组字段
contribs
包含元素"ALGOL"
或"Lisp"
:
db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } )
- 以下操作使用$all查询运算符返回bios collection中的文档,其中数组字段
contribs
包含元素"ALGOL"
和"Lisp"
:
db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } )
有关更多示例,请参见$all。另请参见$elemMatch。
- 以下操作使用$size运算符返回
contribs
的数组大小为 4 的bios collection中的文档:
db.bios.find( { contribs: { $size: 4 } } )
有关更多信息和查询数组的示例,请参见:
有关特定于数组的查询运算符的列表,请参见Array。
查询一系列文件
以下示例查询bios collection中的awards
数组。
- 以下操作返回bios collection中的文档,其中
awards
数组包含award
字段等于"Turing Award"
的元素:
db.bios.find(
{ "awards.award": "Turing Award" }
)
- 以下操作返回bios collection中的文档,其中
awards
数组包含至少一个元素,其中award
字段等于"Turing Award"
并且year
字段都大于 1980:
db.bios.find(
{ awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } } }
)
使用$elemMatch运算符可以在数组元素上指定多个条件。
有关更多信息和查询数组的示例,请参见:
有关特定于数组的查询运算符的列表,请参见Array。
Projections
projection
参数指定要返回的字段。该参数包含包含或排除规范,但不能同时包含两者,除非排除是针对_id
字段。
Note
除非投影文档_id: 0
中明确排除了_id
字段,否则将返回_id
字段。
指定要返回的字段
以下操作在bios collection中查找所有文档,并且仅返回name
字段,contribs
字段和_id
字段:
db.bios.find( { }, { name: 1, contribs: 1 } )
Note
除非投影文档_id: 0
中明确排除了_id
字段,否则将返回_id
字段。
明确排除的字段
以下操作查询bios collection并返回name
嵌入式文档中的first
字段和birth
字段(*除外)的所有字段:
db.bios.find(
{ contribs: 'OOP' },
{ 'name.first': 0, birth: 0 }
)
明确排除_id 字段
Note
除非投影文档_id: 0
中明确排除了_id
字段,否则将返回_id
字段。
以下操作在bios collection中查找文档,并且仅返回name
字段和contribs
字段:
db.bios.find(
{ },
{ name: 1, contribs: 1, _id: 0 }
)
关于阵列和嵌入式文档
以下操作查询bios collection并返回name
嵌入式文档中的last
字段以及contribs
数组中的前两个元素:
db.bios.find(
{ },
{
_id: 0,
'name.last': 1,
contribs: { $slice: 2 }
}
)
See also
迭代返回的游标
在mongo Shell 中,如果未使用var
关键字将返回的游标分配给变量,则游标将自动进行迭代以访问最多与查询匹配的前 20 个文档。您可以设置DBQuery.shellBatchSize
变量来更改自动迭代的文档数。
要手动遍历结果,请使用var
关键字将返回的游标分配给变量,如以下各节所示。
具有变量名
下面的示例使用变量myCursor
遍历光标并打印匹配的文档:
var myCursor = db.bios.find( );
myCursor
使用 next()方法
下面的示例使用游标方法next()来访问文档:
var myCursor = db.bios.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}
要进行打印,您也可以使用printjson()
方法代替print(tojson())
:
if (myDocument) {
var myName = myDocument.name;
printjson(myName);
}
使用 forEach()方法
下面的示例使用游标方法forEach()来迭代游标并访问文档:
var myCursor = db.bios.find( );
myCursor.forEach(printjson);
修改光标行为
mongoShell 程序和drivers提供了几种游标方法,它们调用find()方法返回的* cursor *来修改其行为。
Order 结果集中的文件
sort()方法对结果集中的文档进行排序。以下操作返回bios collection中按name
字段升序排列的文档:
db.bios.find().sort( { name: 1 } )
sort()对应于 SQL 中的ORDER BY
语句。
限制要退回的文件数
limit()方法限制了结果集中的文档数。以下操作最多返回bios collection中的5
个文档:
db.bios.find().limit( 5 )
limit()对应于 SQL 中的LIMIT
语句。
设置结果集的起点
skip()方法控制结果集的起点。以下操作将跳过bios collection中的前5
个文档,并返回所有剩余的文档:
db.bios.find().skip( 5 )
Specify Collation
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
collation()方法为db.collection.find()操作指定collation。
db.bios.find( { "name.last": "hopper" } ).collation( { locale: "en_US", strength: 1 } )
合并光标方法
db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )
这两个语句是等效的。也就是说,链接limit()和sort()方法的 Sequences 并不重要。根据“名称”上的升序排列,这两个语句均返回前五个文档。