ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB(11)- 查询数组

2021-06-01 23:02:55  阅读:157  来源: 互联网

标签:11 dim cm tags MongoDB item 数组 blank red


插入测试数据

db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
   { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
   { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
   { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
   { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]); 

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

 

精确匹配数组

> db.inventory.find( { tags: ["red", "blank"] } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }

不仅数组的值要完全一致,顺序也得保持一致

 

$all 操作符

如果希望找到的是包含 red、blank 两个元素的数组,可以使用 $all 操作符

> db.inventory.find({tags:{$all:["red","blank"]}})
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

后面再展开细讲这个操作符

 

查询数组字段包含一个指定值元素的所有文档

> db.inventory.find( { tags: "red" } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

找到 tags 字段包含 red 元素的所有文档

 

对数组字段中的元素指定单个条件

语法格式

{ <array field>: { <operator1>: <value1>, ... } }
{ 数组字段名 : { 操作符:值, 操作符2: 值2, ..... }}

 

实际栗子

查询数组 dim_cm 中至少包含一个值大于 25 的元素的所有文档

> db.inventory.find( { dim_cm: { $gt: 25 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

 

对数组元素指定多个条件

在数组元素上指定复合条件时,可以指定查询使得单个数组元素满足这些条件或数组元素的任意组合满足条件

 

在数组元素上使用复合条件

> db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de27"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }

 dim_cm 数组包含在某种组合中满足查询条件的元素

  1. 满足大于 15 的条件
  2. 满足小于20的条件
  3. 同时满足这两个条件

多个条件是或的关系

 

查询满足多个条件的数组元素

上面的栗子虽然指定了复合条件,但只需要满足其中一个就匹配成功

如果想必须同时满足多个条件呢?

使用 $elemMatch 运算符在数组元素上指定多个条件,使得至少一个数组元素满足所有指定条件

 

小栗子

查询 dim_cm 数组包含至少一个大于 ($gt) 22 且小于 ($lt) 30 的元素的文档

> db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

  

按数组索引位置查询元素

查询 dim_cm 数组第二个元素大于 25 的文档(索引位置从 0 开始哦)

> db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

  

按数组长度查询数组

查询包含长度= 3 的 tags 数组的文档

> db.inventory.find( { "tags": { $size: 3 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }

  

标签:11,dim,cm,tags,MongoDB,item,数组,blank,red
来源: https://www.cnblogs.com/poloyy/p/14839222.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有