Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB(12)- 查询嵌入文档的数组

MongoDB(12)- 查询嵌入文档的数组

作者头像
小菠萝测试笔记
发布于 2021-06-10 09:00:52
发布于 2021-06-10 09:00:52
4.9K10
代码可运行
举报
运行总次数:0
代码可运行

插入测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 数组中包含 { warehouse: "A", qty: 5 } 的所有文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }

嵌套文档内的字段,除了字段名、字段值一样,顺序也得一致,否则不匹配

精确匹配整个文档数组的栗子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find({instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ]})
{ "_id" : ObjectId("60b6dbbf67b3da7412587548"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }

在文档数组中嵌入的字段上指定查询条件

在 instock 数组中,至少有一个文档的 qty 字段值是 ≤20 的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { 'instock.qty': { $lte: 20 } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587547"), "item" : "notebook", "instock" : [ { "warehouse" : "C", "qty" : 5 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587548"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587549"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da741258754a"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

访问数组中文档的字段,如果不知道文档的准确索引值,只能按照以下格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
数组字段名.文档字段名
instock.qty

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

上面的栗子是直接根据字段名查找

在 instock 数组中,第一个元素包含字段 qty ,且值 ≤20 的文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587547"), "item" : "notebook", "instock" : [ { "warehouse" : "C", "qty" : 5 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da741258754a"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

在文档数组中的字段指定组合(多个)查询条件

栗子一

找到在 instock 数组中【至少有一个嵌入文档包含 qty > 10,以及至少有一个嵌入文档(但不一定是同一个嵌入文档)包含 qty ≤20 】的文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { "instock.qty": { $gt: 10,  $lte: 20 } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587548"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587549"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da741258754a"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
  • 不需要在同一个文档同时满足两个条件(当然同一个文档同时满足也可以)
  • 只要整个文档数组中,两个条件都至少有一个满足的文档即可
栗子二

找到在 instock 数组中【至少有一个嵌入文档包含 qty = 5,以及至少有一个嵌入文档(但不一定是同一个嵌入文档)包含 warehouse = A 】的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587549"), "item" : "planner", "instock" : [ { "warehouse" : "A", "qty" : 40 }, { "warehouse" : "B", "qty" : 5 } ] }

在文档数组中单个嵌套文档满足多个查询条件

前言

上面的栗子都是单个嵌套文档或多个嵌套文档满足多个查询条件即可

如果想确保单个嵌套文档必须同时满足多个查询条件呢?

使用 $elemMatch 运算符!(前面讲数组的时候也提到过)

栗子一

找到在 instock 数组【至少有一个包含 qty = 5 和 warehouse = A 的嵌入文档 】的文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
栗子二

找到在 instock 数组【至少有一个包含 qty > 10 且 ≤ 20 的嵌入文档】的文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )
{ "_id" : ObjectId("60b6dbbf67b3da7412587546"), "item" : "journal", "instock" : [ { "warehouse" : "A", "qty" : 5 }, { "warehouse" : "C", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da7412587548"), "item" : "paper", "instock" : [ { "warehouse" : "A", "qty" : 60 }, { "warehouse" : "B", "qty" : 15 } ] }
{ "_id" : ObjectId("60b6dbbf67b3da741258754a"), "item" : "postcard", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
hello,同学,你好,有关内嵌文档的查询有个问题想咨询下,我的内嵌子文档是这样的,{"_id":xxx,"version":{"a-1.0":{"time":100},"b-1.0":{"time":200}}}. 可以看出内嵌子文档有a-1.0中间有符号-这种特殊的,我想直接查询db.version.find({"version.a-1.0":{"$exists":true}}),却查不到,可以判断是这个-特殊符号导致的,但是不知道该如何对这样的内嵌子文档的key进行查询,想咨询下同学
hello,同学,你好,有关内嵌文档的查询有个问题想咨询下,我的内嵌子文档是这样的,{"_id":xxx,"version":{"a-1.0":{"time":100},"b-1.0":{"time":200}}}. 可以看出内嵌子文档有a-1.0中间有符号-这种特殊的,我想直接查询db.version.find({"version.a-1.0":{"$exists":true}}),却查不到,可以判断是这个-特殊符号导致的,但是不知道该如何对这样的内嵌子文档的key进行查询,想咨询下同学
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
MongoDB(13)- 查询操作返回指定的字段
答案是不能的,如果想指定 <projection> 是包含字段,那所有字段值都得统一是 1,相反如果是不包含,也必须都是 0
小菠萝测试笔记
2021/06/10
6.7K0
技术干货| 一文读懂如何查询 MongoDB 文档
点击下方公众号关注并分享获取 MongoDB 最新资讯 一.查询文档 本段提供了使用 mongo shell中 db.collection.find() 方法查询的案例。案例中使用的 inventory 集合数据可以通过下面的语句产生。db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },   { item: "notebook", qty: 50, s
MongoDB中文社区
2022/07/07
4.2K0
MongoDB(11)- 查询数组
如果希望找到的是包含 red、blank 两个元素的数组,可以使用 $all 操作符
小菠萝测试笔记
2021/06/09
2.5K0
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:
小菠萝测试笔记
2021/06/09
2.2K0
MongoDB(10)- 查询嵌套文档
MongoDB 学习笔记3 - 命令行操作示例
总结:MongoDB 可以每行数据的结构都不同,支持非结构化数据。 区别于 传统的严格结构化数据。
张云飞Vir
2021/07/23
3.5K0
Mongodb多键索引之数组文档
接上2篇文档关于多键索引内容,接着学习数组文档,主要实验来验证如何进行高效数据查询,通过对比方式来验证3种多键索引优缺点以及适合场景,具体链接如下:
徐靖
2020/08/25
3.4K0
MongoDB(9)- 文档查询操作之 find() 的简单入门
MongoDB 支持查询条件操作符,下表为 MongoDB 与 RDBMS(关系型数据库,Mysql)常见的查询条件操作符的对比
小菠萝测试笔记
2021/06/09
9490
MongoDB Document CRUD Operations
通过在find方法中传入Query Filter Documents,Query Filter Documents可以完成对特定记录的读取、更新和删除操作,格式如下:
shysh95
2024/06/14
2470
MongoDB Document CRUD Operations
硬卷 NoSQL 数据库系列(二):MongoDB 安装与 CURD 基本操作
面介绍了:MongoDB 知识体系与基础概念相关的知识点。今天我将详细的为大家介绍MongoDB的安装和最基本的CURD操作的相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
民工哥
2023/08/25
2650
硬卷 NoSQL 数据库系列(二):MongoDB 安装与 CURD 基本操作
MongoDB基本概念
Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库,说到非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,关系数据库的所使用的SQL语句自从 IBM 发明出来以后,已经有 40 多年的历史了,但是时至今日,开发程序员一般不太喜欢这个东西,因为它的基本理念和程序员编程的想法不一致。后来所谓的 NoSQL 风,指的就是那些不用 SQL 作为查询语言的数据存储系统,而文档数据库 MongoDB 正是 NoSQL 的代表。看一下当下数据库的排名就会发现,目前排在Mongodb数据库前面的无一例外是老牌的关系型数据库,而在NoSQL序列中,Mongodb排名第一,且有上升的趋势。
Java廖志伟
2022/03/07
6.7K0
MongoDB基本概念
安装和使用MongoDB
MongoDB是一个著名的NoSQL数据库,顾名思义就是不使用SQL的数据库,目前在很多场景都有使用。如果你不喜欢使用笨拙的各种SQL数据库,可以尝试使用一下MongoDB,会有不一样的感受。本文就是
乐百川
2018/01/09
3.9K0
安装和使用MongoDB
MongoDB入门笔记
You can also view the log file to see the current status of your mongod process:
编程随想曲
2022/04/21
2350
mongodb的CRUD操作详解2-find
查询操作 比较运算符 英文 数学符号 $lt Lower Than < $lte Lower Than or Euqal <= $gt Greater Than > $gte Greater Than or Equal >= $ne Not Equal != 逻辑运算符 含义 $or 或运算 $in 元素 In 集合(数组) $nin 元素 not In 集合(数组) $not 取反 //查询集合内所有文档,pretty格式化查询结果 db.inventory.find( {} ) db.invento
字母哥博客
2020/09/23
5270
MongoDB中的限制与阈值
最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于该限制的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参阅mongofiles和驱动程序的文档。
MongoDB中文社区
2021/06/10
14.5K0
mongodb系列(2)-基本的CURD的使用
MongoDB在插入一条数据后,会自动增加一个_id自动,作为主键,如果插入的文档省略了id字段,则会自动生产一个Object_id字段
爽朗地狮子
2022/10/21
5950
mongodb 学习五,聚合操作实操
在 users 里面准备一组数据,包含 item ,qty,status,tags 和 size 字段,其中 size 是内嵌文档,size 里面又包含了 h,w,uom 字段
阿兵云原生
2023/02/16
4890
MongoDB(8)- 文档删除操作
deleteMany() 语法格式 db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } ) remove() 语法格式 语法一 db.collection.remove( <query>, <justOne> ) 语法二 db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document>, collation: <document> } ) 参数说明
小菠萝测试笔记
2021/06/09
7420
MongoDB(8)- 文档删除操作
[置顶] 数据库MongoDB查询语句--持续更新
链接:https://pan.baidu.com/s/1RjU1BXq2rXFG07Zaw5BHrQ 提取码:o1w5
JQ实验室
2022/01/11
3.9K0
索引实操练习
向 mydoc 集合中,插入多条数据,mydoc 之前是没有存在过的,我们直接使用 db.mydoc.insertMany() ,mongodb 会默认给我们新建这个集合
阿兵云原生
2023/02/16
2880
MongoDB从安装到可视化工具使用
openssl如果已安装(输入openssl version查看),若版本不是1.1可参考以下博客升级openssl: 升级openssl libssl.so.1.1报错 `GLIBC_2.18报错
唔仄lo咚锵
2021/12/31
6380
MongoDB从安装到可视化工具使用
相关推荐
MongoDB(13)- 查询操作返回指定的字段
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验