读取操作从集合中检索文档;即查询集合中的文档。MongoDB 提供了从集合读取文档的下列方法:
db.collection.find()
可以指定查询筛选器或标识要返回的文档的条件。如下图:
下面提供了使用 mongo shell 中的 db.Collection.find() 方法进行查询操作的示例。下面的示例使用 inventory 集合。若要填充 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
若要指定相等条件,请在查询筛选文档中使用 <field>:<value> 表达式:
{ <field1>: <value1>, ... }
以下示例从 inventory 集合中选择状态等于 “D” 的所有文档:
db.inventory.find( { status: "D" } )
此操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "D"
查询筛选器文档可以使用查询运算符以下列形式指定条件:
{ <field1>: { <operator1>: <value1> }, ... }
以下示例从 inventory 集合中检索状态等于 “A” 或 “D” 的所有文件:
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
注意:虽然可以使用 $or 运算符表示此查询,但在对同一字段执行等式检查时,请使用 $in 运算符而不是 $or 运算符。
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status in ("A", "D")
复合查询可以为集合的文档中的多个字段指定条件。隐含地,逻辑连接 AND 连接复合查询的子句,以便查询在集合中选择与所有条件匹配的文档。
以下示例检索 inventory 集合中状态等于 “A” 且 qty 小于 ($lt)30 的所有文档:
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" AND qty < 30
使用 $or 运算符,您可以指定一个复合查询,它将每个子句与逻辑或连接连接起来,以便查询在集合中选择至少匹配一个条件的文档。
以下示例检索 inventory 集合中状态等于 “A” 或 qty 小于($lt)30 的所有文档:
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" OR qty < 30
在下面的示例中,复合查询文档选择集合中 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%")
注意:MongoDB 支持正则表达式 $regex 查询来执行字符串模式匹配。