db.collection.find()

在本页面

Definition

Parameter Type Description
query document 可选的。使用query operators指定选择过滤器。要返回集合中的所有文档,请省略此参数或传递一个空文档({})。
projection document 可选的。指定要在与查询过滤器匹配的文档中返回的字段。要返回匹配文档中的所有字段,请省略此参数。有关详细信息,请参见Projection
Returns: 符合query标准的文档cursor。当find()方法“返回文档”时,该方法实际上是将光标返回到文档。

Behavior

Projection

projection参数确定在匹配文档中返回哪些字段。 projection参数采用以下格式的文档:

{ field1: <value>, field2: <value> ... }

<value>可以是以下任意一个:

视图上的find()操作不支持以下projection运算符:

Note

对于_id字段,您不必显式指定_id: 1即可返回_id字段。除非您指定_id: 0禁止显示该字段,否则find()方法始终返回_id字段。

projection 不能包含包含和排除两个规范,除了_id字段除外。在明确包含字段的投影中,_id字段是唯一可以明确排除的字段。

Cursor Handling

mongo shell 中执行db.collection.find()会自动迭代光标以显示最多前 20 个文档。键入itcontinue 迭代。

要使用驱动程序访问返回的文档,请对driver language使用适当的光标处理机制。

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 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeoutmaxTimeMS大于 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()

查找符合查询条件的文档

平等查询

db.bios.find( { _id: 5 } )
db.bios.find( { "name.last": "Hopper" } )

Note

要访问嵌入式文档中的字段,请使用dot notation("<embedded document>.<field>")。

使用运算符查询

要查找符合一组选择标准的文档,请使用<criteria>参数调用find()

MongoDB 提供了各种query operators来指定条件。

db.bios.find(
   { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
)
db.bios.find( { birth: { $gt: new Date('1950-01-01') } } )
db.bios.find(
   { "name.last": { $regex: /^N/ } }
)

有关查询运算符的列表,请参见Query Selectors

查询范围

组合比较运算符以指定字段的范围。以下操作从bios collection文档返回,其中birthnew 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数组。

db.bios.find( { contribs: "UNIX" } )
db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } )
db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } )

有关更多示例,请参见$all。另请参见$elemMatch

db.bios.find( { contribs: { $size: 4 } } )

有关更多信息和查询数组的示例,请参见:

有关特定于数组的查询运算符的列表,请参见Array

查询一系列文件

以下示例查询bios collection中的awards数组。

db.bios.find(
   { "awards.award": "Turing Award" }
)
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 }
   }
)

迭代返回的游标

find()方法向结果返回cursor

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 } )

合并光标方法

以下语句链接游标方法limit()sort()

db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )

这两个语句是等效的。也就是说,链接limit()sort()方法的 Sequences 并不重要。根据“名称”上的升序排列,这两个语句均返回前五个文档。

可用的 mongo Shell 游标方法

cursor.allowDiskUse()

cursor.allowPartialResults()
cursor.batchSize()
cursor.close()
cursor.isClosed()
cursor.collation()
cursor.comment()
cursor.count()
cursor.explain()
cursor.forEach()
cursor.hasNext()
cursor.hint()
cursor.isExhausted()
cursor.itcount()
cursor.limit()
cursor.map()
cursor.max()
cursor.maxTimeMS()
cursor.min()
cursor.next()
cursor.noCursorTimeout()
cursor.objsLeftInBatch()
cursor.pretty()
cursor.readConcern()
cursor.readPref()
cursor.returnKey()
cursor.showRecordId()
cursor.size()
cursor.skip()
cursor.sort()
cursor.tailable()
cursor.toArray()
首页