查询嵌入式文档数组
本页提供了在mongosh中使用db.collection.find()方法对嵌套文档数组进行查询操作的示例。
本页上的示例使用inventory集合。连接到MongoDB实例中的测试数据库,然后创建inventory集合:
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] },
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
查询嵌套在数组中的文档
下面的例子选择所有的文档,其中一个元素在stock数组中匹配指定的文档:
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
整个嵌入/嵌套文档上的相等匹配要求精确匹配指定的文档,包括字段顺序。例如,下面的查询不匹配inventory集合中的任何文档:
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
指定文档数组中字段的查询条件
什么是嵌入式文档数组?
在 MongoDB 中,嵌入式文档数组是指在一个文档中嵌套包含多个文档的数组。嵌入式文档数组在表示多个相关记录时很有用,比如一个用户文档中嵌入了他们的收藏夹或订单记录。
在 MongoDB 中,嵌入式文档数组是一种常见的数据结构,它允许我们在一个文档中嵌入包含多个文档的数组。我们将介绍如何使用 MongoDB 的查询操作符来查询嵌入式文档数组,以及一些常见的查询示例和技巧。
要查询嵌入式文档数组,可以使用 MongoDB 的查询操作符 $elemMatch
来实现。$elemMatch
用于在数组中查找满足指定条件的元素。
指定文档数组中嵌入字段的查询条件
如果您不知道嵌套在数组中的文档的索引位置,请将数组字段的名称与嵌套文档中的字段名称连接起来。
下面的示例选择所有文档,其中至少有一个嵌入文档,其中包含字段qty的值小于或等于20:
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
使用数组索引查询嵌入文档中的字段
使用点表示法,可以为文档中位于数组的特定索引或位置的字段指定查询条件。该数组使用从零开始的索引。
使用点表示法查询时,字段和索引必须在引号内。
下面的示例选择所有文档,其中stock数组的第一个元素包含字段qty的值小于或等于20的文档:
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
为文档数组指定多个条件
当为嵌套在文档数组中的多个字段指定条件时,您可以指定查询,以便单个文档满足这些条件,或者数组中的任何文档组合(包括单个文档)满足条件
单个嵌套文档在嵌套字段上满足多个查询条件
使用$elemMatch操作符在嵌入文档数组上指定多个标准,使至少一个嵌入文档满足所有指定的标准。
下面的例子查询的文档中,如果stock数组中至少有一个嵌入文档,其中包含字段qty等于5和字段warehouse等于A:
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
下面的示例查询在stock数组中至少有一个包含字段qty大于10小于等于20的嵌入文档的文档:
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
元素的组合满足标准
如果数组字段上的复合查询条件不使用$elemMatch操作符,则查询将选择数组中包含满足条件的任何元素组合的文档。
例如,以下查询匹配嵌套在instock数组中的任何文档的qty字段大于10,并且数组中的任何文档(但不一定是相同的嵌入文档)的qty字段小于或等于20的文档:
db.inventory.find( { "instock.qty": { $gt: 10, $lte: 20 } } )
以下示例查询的文档中,instock数组至少有一个包含字段qty等于5的嵌入文档,并且至少有一个包含字段warehouse等于A的嵌入文档(但不一定是相同的嵌入文档):
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
除了 $elemMatch
,MongoDB 还提供了许多其他查询操作符,可以帮助我们进一步筛选嵌入式文档数组。
以下是一些常见的查询操作符的示例:
$size
:用于查询数组长度。例如,{ arrayField: { $size: 2 } }
可以查询数组长度为 2 的文档。
这只是一小部分常用的查询操作符示例,你可以根据自己的需求和条件进行更多的自定义查询操作。
参考文献:
- MongoDB Documentation: https://www.mongodb.com/docs/
- “MongoDB: The Definitive Guide” by Shannon Bradshaw, Eoin Brazil, and Kristina Chodorow.