MongoDB(10)- 查询嵌套文档

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB(10)- 查询嵌套文档

插入测试数据


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" }
]);


后面的栗子都会用到这里的测试数据

 

精确匹配嵌套文档


> db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9d"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }

这种写法不仅需要嵌套文档的字段、值相同,字段顺序也得一致

db.inventory.find(  { size: { w: 21, h: 14, uom: "cm" } }  )


image.png

换了个字段顺序就查不到同一条文档了

 

查询嵌套字段


要在嵌入/嵌套文档中的字段上指定查询条件,语法格式如下

"field.nestedField"

跟 JSON 取值一样,用 . 来找下一级的字段

 

栗子一:嵌套字段等于操作


> db.inventory.find( { "size.uom": "in" } )

{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9e"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }

{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9f"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

size 字段值是一个文档,找到嵌套文档的 h 字段值等于 in 的所有文档

 

栗子二:嵌套字段结合单个查询条件操作符


> db.inventory.find( { "size.h": { $lt: 15 } } )
{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9d"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9e"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9f"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
{ "_id" : ObjectId("60b5e622dd6e93ee8bf35aa1"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }


size 字段值是一个文档,找到嵌套文档的 h 字段值小于 15 的所有文档

 

栗子三:多个不同嵌套字段结合 and 操作


> db.inventory.find( { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" } )

{ "_id" : ObjectId("60b5e622dd6e93ee8bf35a9f"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

三个条件必须同时满足

  • size 字段,嵌套文档的 h 字段值小于 15
  • size 字段,嵌套文档的 uom 字段值等于 in
  • status 字段值等于 D

 

重点


如果是指定单个字段的时候,可以不需要加 ""(当然,加了也无妨),比如

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

 

如果是指定嵌套字段,必须加 "" ,比如上面的栗子

db.inventory.find( { "size.uom": "in" } )

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5月前
|
NoSQL MongoDB 数据库
MongoDB 更新文档
10月更文挑战第14天
83 2
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
60 17
|
2月前
|
存储 监控 NoSQL
【赵渝强老师】MongoDB文档级别的并发控制
MongoDB使用WiredTiger存储引擎在文档级别进行并发控制,允许多个写操作同时修改不同文档,但对同一文档的修改需序列化执行。引擎采用乐观锁和意向锁机制处理冲突。通过视频讲解、插入大量文档示例及使用`mongotop`和`db.serverStatus()`命令,演示了如何监控MongoDB的锁信息和读写统计,展示了数据库和集合级别的写锁情况。
103 29
|
3月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
136 9
|
5月前
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
35 1
|
5月前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
63 1
|
5月前
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
85 1
|
5月前
|
NoSQL MongoDB
MongoDB 删除文档
10月更文挑战第15天
80 0
|
5月前
|
存储 JSON NoSQL
MongoDB 插入文档
10月更文挑战第14天
59 0
|
25天前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”