MongoDB查询嵌入式文档数组

查询嵌入式文档数组

本页提供了在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.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值