mongodb / v3.6 / reference / reference-method-db.collection.find.html

db.collection.find()

在本页面

Definition

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

Behavior

Projection

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

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

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

  • 1true将字段包含在return文档中。

  • 0false以排除该字段。

  • 使用Projection Operators表示。

视图上的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 } )
  • 以下操作返回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等于5ObjectId("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文档返回,其中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数组。

  • 以下操作返回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 }
   }
)

迭代返回的游标

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 游标方法