db.collection.find()

    在本页面

    • 定义

    • 行为

    • 例子

      定义

    • db.collection. find(查询,投影)

      • 选择集合或视图中的文档,并将光标返回到所选文档。
    参数 类型 描述
    query document 可选的。使用query operators指定选择过滤器。要 return 集合中的所有文档,请省略此参数或传递空文档({})。
    projection document 可选的。指定_retch 查询过滤器的文档中的 return 字段。要_retret 匹配文档中的所有字段,请省略此参数。有关详细信息,请参阅投影。

    返回: 与匹配query标准的文档。当find()方法“返回文档”时,该方法实际上是将光标返回到文档。

    行为

    投影

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

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

    <value>可以是以下任何一种:

    • 1true在 return 文档中包含该字段。
    • 0false排除该字段。
    • 表达式使用投影操作员。

      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 类型与查询操作数的类型匹配的文档执行比较。考虑以下集合:

    1. { "_id": "apples", "qty": 5 }
    2. { "_id": "bananas", "qty": 7 }
    3. { "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } }
    4. { "_id": "avocados", "qty": "fourteen" }

    以下查询使用$gt来 return qty的 value 大于4的文档。

    1. db.collection.find( { qty: { $gt: 4 } } )

    该查询返回以下文档:

    1. { "_id": "apples", "qty": 5 }
    2. { "_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驱动程序和mongoshell程序将所有操作与服务器会话相关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB驱动程序和mongo外壳程序会创建一个隐式会话并将其与该操作相关联。

    如果会话空闲时间超过30分钟,则MongoDB服务器会将会话标记为已过期,并可以随时关闭它。当MongoDB服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置了30分钟noCursorTimeoutmaxTimeMS30分钟以上的光标。

    对于可能闲置超过30分钟的操作,请使用将该操作与显式会话相关联, Session.startSession()并使用该refreshSessions命令定期刷新该会话。请参阅以获取更多信息。Session Idle Timeout

    交易

    db.collection.find()可以在多文档交易中使用。

    • 对于在事务外部创建的游标,不能getMore在事务内部调用 。
    • 对于在事务中创建的游标,不能getMore在事务外部调用 。

    重要

    在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应替代有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。也就是说,在许多情况下,适当地对数据建模将最大程度地减少对多文档交易的需求。

    有关其他事务使用方面的注意事项(例如运行时限制和操作日志大小限制),另请参见 生产注意事项。

    客户端断开

    从MongoDB 4.2开始,如果发出db.collection.find() 断开连接的客户端在操作完成之前断开连接,则MongoDB将标记db.collection.find()为终止(即killOp在操作上)。

    例子

    本节中的示例使用bios 集合中的文档,其中文档通常具有以下形式:

    1. {
    2. "_id" : <value>,
    3. "name" : { "first" : <string>, "last" : <string> }, // embedded document
    4. "birth" : <ISODate>,
    5. "death" : <ISODate>,
    6. "contribs" : [ <string>, ... ], // Array of Strings
    7. "awards" : [
    8. { "award" : <string>, year: <number>, by: <string> } // Array of embedded documents
    9. ...
    10. ]
    11. }

    要创建和填充bios集合,请参阅bios Example Collection。

    查找集合中的所有文档

    没有参数的find()方法返回集合中的所有文档,并返回文档的所有字段。对于 example,以下操作返回bios 系列中的所有文档:

    1. db.bios.find()

    查找 Match 查询条件的文档

    查询平等

    • 以下操作返回bios 系列中_id等于5的文档:

      1. db.bios.find( { _id: 5 } )
    • 以下操作返回bios 系列中的文档,其中name嵌入文档中的字段last等于"Hopper"

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

      注意

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

      使用 Operators 进行查询

    要查找匹配一组选择条件的文档,请使用<criteria>参数调用find()。

    MongoDB 提供各种query operators来指定标准。

    • 以下操作使用$in operator return bios 系列中的文档,其中_id等于5ObjectId("507c35dd8fada716c89d0013")

      1. db.bios.find(
      2. { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
      3. )
    • 以下操作使用$gt operator 返回bios集合中birth大于new Date('1950-01-01')的所有文档:

      1. db.bios.find( { birth: { $gt: new Date('1950-01-01') } } )
    • 以下操作使用$regex operator return bios 系列中的文档,其中name.last字段以字母N(或"LIKE N%")开头

      1. db.bios.find(
      2. { "name.last": { $regex: /^N/ } }
      3. )

    有关查询 operators 的列表,请参阅查询 Selectors。

    查询范围

    组合比较 operators 以指定字段的范围。以下操作从bios 系列文档返回,其中birth介于new Date('1940-01-01')new Date('1960-01-01')之间(独占):

    1. db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } )

    有关查询 operators 的列表,请参阅查询 Selectors。

    查询多个条件

    以下操作返回bios 系列中的所有文档,其中birth字段为比…更棒 new Date('1950-01-01')death字段不存在:

    1. db.bios.find( {
    2. birth: { $gt: new Date('1920-01-01') },
    3. death: { $exists: false }
    4. } )

    有关查询 operators 的列表,请参阅查询 Selectors。

    查询嵌入式文档

    以下示例查询bios 系列中的name嵌入字段。

    查询嵌入式文档的精确匹配

    以下操作返回bios 系列中的文档,其中嵌入的文档name正好是{ first: "Yukihiro", last: "Matsumoto" },包括 order:

    1. db.bios.find(
    2. { name: { first: "Yukihiro", last: "Matsumoto" } }
    3. )

    name字段必须完全匹配嵌入文档。查询将使文档与具有name以下任一值的字段进行匹配:

    1. {
    2. first: "Yukihiro",
    3. aka: "Matz",
    4. last: "Matsumoto"
    5. }
    6. {
    7. last: "Matsumoto",
    8. first: "Yukihiro"
    9. }

    查询嵌入文档的字段

    以下操作返回bios 系列中的文档,其中嵌入文档name包含带有 value "Yukihiro"的字段first和带有 value "Matsumoto"的字段last。该查询使用点符号访问嵌入文档中的字段:

    1. db.bios.find(
    2. {
    3. "name.first": "Yukihiro",
    4. "name.last": "Matsumoto"
    5. }
    6. )

    该查询匹配name字段包含嵌入文档的文档,其中first字段包含 value "Yukihiro",字段last包含 value "Matsumoto"。例如,查询将使用包含以下任一值的name字段匹配文档:

    1. {
    2. first: "Yukihiro",
    3. aka: "Matz",
    4. last: "Matsumoto"
    5. }
    6. {
    7. last: "Matsumoto",
    8. first: "Yukihiro"
    9. }

    有关更多信息和示例,另请参阅查询 Embedded/Nested 文档。

    查询数组

    查询 Array 元素

    以下示例查询bios 系列中的contribs array。

    • 以下操作返回bios 系列中的文档,其中 array 字段contribs包含元素"UNIX"

      1. db.bios.find( { contribs: "UNIX" } )
    • 以下操作返回bios 系列中的文档,其中 array 字段contribs包含元素"ALGOL""Lisp"

      1. db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } )
    • 以下操作使用$all query operator return bios 系列中的文档,其中 array 字段contribs包含元素"ALGOL""Lisp"

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

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

    • 以下操作使用$size operator return bios 系列中contribs的 array 大小为 4 的文档:
      1. db.bios.find( { contribs: { $size: 4 } } )

    有关查询 array 的更多信息和示例,请参阅:

    • 查询 Array
    • 查询嵌入式文档的 Array

    有关 array 特定查询 operators 的列表,请参阅Array。

    查询 Array of Documents

    以下示例查询bios 系列中的awards array。

    • 以下操作返回bios 系列中的文档,其中awards array 包含award字段等于"Turing的元素:

      1. db.bios.find(
      2. { "awards.award": "Turing Award" }
      3. )
    • 以下操作返回bios 系列中的文档,其中awards array 包含至少一个元素,其中award字段等于"Turing Award"year字段大于 1980:

      1. db.bios.find(
      2. { awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } } }
      3. )

    使用$elemMatch operator 在 array 元素上指定多个条件。

    有关查询 array 的更多信息和示例,请参阅:

    • 查询 Array
    • 查询嵌入式文档的 Array

      有关 array 特定查询 operators 的列表,请参阅Array。

      预测

    projection参数指定 return 的哪些字段。除非排除属于_id字段,否则该参数包含 include 或 exclude 规范,而不是两者。

    注意

    除非在投影文档_id: 0中明确排除_id字段,否则返回_id字段。

    指定 Return 的字段

    以下操作查找bios 系列中的所有文档,并仅返回name字段,contribs字段和_id字段:

    1. db.bios.find( { }, { name: 1, contribs: 1 } )

    注意

    除非在投影文档_id: 0中明确排除_id字段,否则返回_id字段。

    明确排除的字段

    以下操作查询bios 系列并返回除name嵌入文档和birth字段中的first字段之外的所有字段:

    1. db.bios.find(
    2. { contribs: 'OOP' },
    3. { 'name.first': 0, birth: 0 }
    4. )

    明确排除_id 字段

    注意

    除非在投影文档_id: 0中明确排除_id字段,否则返回_id字段。

    以下操作在bios 系列中查找文档,并仅返回name字段和contribs字段:

    1. db.bios.find(
    2. { },
    3. { name: 1, contribs: 1, _id: 0 }
    4. )

    关于数组和嵌入式文档

    以下操作查询bios 系列并返回name嵌入文档中的last字段和contribs array 中的前两个元素:

    1. db.bios.find(
    2. { },
    3. {
    4. _id: 0,
    5. 'name.last': 1,
    6. contribs: { $slice: 2 }
    7. }
    8. )

    也可以看看

    从查询返回的项目字段

    迭代返回的光标

    find()方法返回光标到结果。

    在mongo shell 中,如果未使用var关键字将返回的游标分配给变量,则会自动迭代游标以访问最匹配查询的前 20 个文档。您可以设置DBQuery.shellBatchSize变量以更改自动迭代文档的数量。

    要手动迭代结果,请将返回的光标分配给带有var关键字的变量,如以下部分所示。

    使用 Variable Name

    以下 example 使用变量myCursor迭代游标并打印匹配的文档:

    1. var myCursor = db.bios.find( );
    2. myCursor

    使用 next()方法

    以下 example 使用游标方法next()来访问文档:

    1. var myCursor = db.bios.find( );
    2. var myDocument = myCursor.hasNext() ? myCursor.next() : null;
    3. if (myDocument) {
    4. var myName = myDocument.name;
    5. print (tojson(myName));
    6. }

    要打印,您还可以使用printjson()方法而不是print(tojson())

    1. if (myDocument) {
    2. var myName = myDocument.name;
    3. printjson(myName);
    4. }

    使用 forEach()方法

    以下 example 使用游标方法forEach()来迭代游标并访问文档:

    1. var myCursor = db.bios.find( );
    2. myCursor.forEach(printjson);

    修改游标行为

    mongo shell 和司机提供了几个游标方法,这些方法调用find()方法返回的游标来修改其行为。

    Order 结果集中的文档

    sort()方法对结果集中的文档进行排序。以下操作返回name中按name字段按升序排序的文档中的文档:

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

    sort()对应于 SQL 中的ORDER BY语句。

    将文档数限制为 Return

    limit()方法限制结果集中的文档数。以下操作最多返回bios 系列中的5个文档:

    1. db.bios.find().limit( 5 )

    limit()对应于 SQL 中的LIMIT语句。

    设置结果集的起始点

    skip()方法控制结果集的起始点。以下操作会跳过bios 系列中的第一个5文档并返回所有剩余文档:

    1. db.bios.find().skip( 5 )

    指定排序规则

    整理允许用户为 string 比较指定 language-specific 规则,例如字母和重音标记的规则。

    collation()方法为db.collection.find()操作指定整理。

    1. db.bios.find( { "name.last": "hopper" } ).collation( { locale: "en_US", strength: 1 } )

    结合光标方法

    以下 statements 链游标方法limit()和sort():

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

    这两个语句是等价的; 即:你链接limit()和sort()方法的 order 并不重要。两个 statements return 前五个文档,由’name’上的升序排序 order 确定。

    可用的mongoShell游标方法

    译者:李冠飞

    校对:

    参见

    原文 - db.collection.find()