查询文档

本文提供了使用mongo shell中db.collection.find()方法查询的案例。案例中使用的inventory集合数据可以通过下面的语句产生。

db.inventory.insertMany([
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);

检索集合中的所有文档

如果想检索集合中的所有文档,可以在find方法中传一个空文档作为查询过滤条件。查询过滤参数确定选择条件:

db.inventory.find( {} )

上述操作对应如下SQL语句:

SELECT * FROM inventory

有关该方法语法的更多信息,请参阅 find()

等值查询

查询过滤文档中使用**<字段>:<值>**表达式实现等值查询:

{ <field1>: <value1>, ... }

下面的案例返回inventory集合中status等于"D"**的所有文档:

db.inventory.find( { status: "D" } )

上述操作对应如下SQL语句:

SELECT * FROM inventory WHERE status = "D"

查询条件中使用查询操作符

查询过滤文档中可以使用查询操作符来指定多个条件,格式如下:

{ <field1>: { <operator1>: <value1> }, ... }

下面的案例返回inventory集合中status等于**"A""D"**的所有文档。

db.inventory.find( { status: { $in: [ "A", "D" ] } } )

Note:

尽管可以使用$or操作符来满足上述需求,但是在对相同字段进行等值检索的时候更建议使用$in

上述操作对应如下SQL:

SELECT * FROM inventory WHERE status in ("A", "D")

有关MongoDB查询运算符的完整列表,请参考查询和映射操作符

AND条件

可以指定文档中的多个字段作为查询条件。在查询语句中使用AND连接多个查询条件来检索集合中满足所有查询条件的文档。

下面的案例返回inventory集合中status等于**"A" 并且qty**小于($lt)30的所有文档:

db.inventory.find( { status: "A", qty: { $lt: 30 } } )

上述操作对应如下SQL:

SELECT * FROM inventory WHERE status = "A" AND qty < 30

关于MongoDB的比较操作符可以参考比较操作符

OR条件

使用$or运算符,可以指定一个联合查询,该查询将每个子句与逻辑 OR 连接起来,以便查询选择集合中至少匹配一个条件的文档。

下面的案例返回inventory集合中status等于**"A" 或者qty**小于($lt)30的所有文档。

db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

上述操作对应如下SQL:

SELECT * FROM inventory WHERE status = "A" OR qty < 30

Note:

使用比较操作符的查询受Type Bracketing的约束。

同时使用AND和OR条件

下面的案例返回inventory集合中status等于**"A" 并且qty小于 ($lt) 30或者item** 是以p字符开头的所有文档。

db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

上述操作对应如下SQL:

SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")

Note:

MongoDB支持正则表达式操作符$regex来做字符串模式匹配。

其他查询教程

其他查询案例:

行为

游标

使用 db.collection.find()方法返回检索到文档的一个游标

读隔离

新增加于MongoDB3.2版本

对于副本集或者分片副本集的查询,读关注允许客户端选择读的隔离级别。更多的信息可以查看Read Concern

其它的方法

下面的方法也可以从集合中查询文档:

Note:

db.collection.findOne 方法提供了返回单个文档的读操作。

实际上,db.collection.findOne 就是db.collection.find() 方法后面加了个限制条数1。

原文链接:https://docs.mongodb.com/manual/tutorial/query-documents/

译者:张芷嘉

最后更新于