MongoDB CRUD操作:内嵌文档数组查询

MongoDB 内嵌文档数组查询

文章目录

可以使用下面几种方法查询MongoDB中的嵌入文档:

  • 编程语言的驱动程序,比如:Java、Python灯。
  • MongoDB Atlas UI。
  • MongoDB Compass。
  • 其他第三方工具。

下面的示例使用mongosh的db.collection.find()方法对内嵌/嵌套文档进行查询,如果使用其他编程语言或驱动,写法会有不同。

首先,使用下面的语句创建inventory数据集:

js 复制代码
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 } ] }
]);

查询数组内嵌文档

下面的示例查询instock数组中元素与指定文档匹配的文档:

js 复制代码
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

整个内嵌文档的等价匹配要求与指定文档完全匹配,包括字段顺序。例如,下面的查询与集合中所有文档都不匹配:

js 复制代码
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )

为文档数组中的字段指定查询条件

指定文档数组内嵌文档字段的查询条件

如果不知道数组中内嵌文档的索引位置,可将数组字段名称与点(.)和内嵌文档中的字段名称连接起来。

下面的示例查询instock数组中至少有一个内嵌文档包含qty字段(其值小于或等于20)的文档:

js 复制代码
db.inventory.find( { 'instock.qty': { $lte: 20 } } )

使用数组索引查询内嵌文档的字段

可以使用点号表示法,指定文档中数组指定索引位置的字段的查询条件,数组的索引从零开始,使用点表示法查询时,字段和索引必须位于引号内。

js 复制代码
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )

为文档数组指定多个条件

对内嵌文档数组的多个字段指定条件时,可以指定单个、多个或全部文档满足条件。

单个内嵌文档满足内嵌字段的多个查询条件

使用$elemMatch操作符可以在内嵌文档数组上指定多个条件,这样至少有一个内嵌文档满足条件。

下面的例子查询instock数组中至少有一个内嵌文档同时包含qty字段等于5warehouse字段等于A的文档:

js 复制代码
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )

下面的列子查询instock数组中至少有一个内嵌文档包含qty大于10且小于或等于20的文档:

js 复制代码
db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

符合标准的元素组合

如果数组字段上的复合查询条件不使用 $elemMatch 运算符,则查询将选择其数组包含满足条件的任意元素组合的文档。

例如,以下查询匹配 instock 数组中嵌套的任何文档的 qty 字段大于 10 且数组中的任何文档(但不一定是相同的嵌入文档)的 qty 字段小于或等于 20 的文档:

js 复制代码
db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )

以下示例查询 instock 数组中至少有一个包含等于 5 的字段 qty 的嵌入文档和至少一个包含等于 A 的字段仓库的嵌入文档(但不一定是相同的嵌入文档)的文档:

js 复制代码
db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )

使用 MongoDB Atlas 查询文档数组

相关推荐
lucky_lyovo15 分钟前
Neo4j--登录及简单操作
数据库·neo4j
影子240130 分钟前
java jdbc连接sqlserver2008R2版本数据库报错,驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接
java·数据库·ssl
0_0梅伊阁诗人41 分钟前
Django ORM 模型
开发语言·数据库·笔记·python·oracle·django
倔强的石头1061 小时前
Windows系统下KingbaseES数据库保姆级安装教程(附常见问题解决)
数据库·windows
躲在云朵里`1 小时前
Redis深度解析:核心数据结构、线程模型与高频面试题
数据结构·数据库·redis
m0_453806871 小时前
【已解决】mongoose在mongodb中添加数据,数据库默认复数问题
数据库·mongodb
非凡ghost1 小时前
AOMEI Partition Assistant磁盘分区工具:磁盘管理的得力助手
linux·运维·前端·数据库·学习·生活·软件需求
恣艺1 小时前
Redis是什么?一篇讲透它的定位、特点与应用场景
数据库·redis·缓存
天天爱吃肉82182 小时前
【比亚迪璇玑架构深度解析:重新定义智能电动汽车的“整车智能”】
数据库·人工智能·嵌入式硬件·架构·汽车
一成码农2 小时前
MySQL问题8
数据库·mysql