文章目录
MongoDB数组查询
本文提供了在 mongosh 中使用
db.collection.find()
方法对数组字段进行查询操作的示例。 本文的示例使用清单(
inventory
)集合。 要填充清单集合,请运行以下命令:
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]}]);
数组匹配
要在数组上指定相等条件,请使用查询文档
{ <field>: <value> }
其中
<value>
是要匹配的确切数组,包括元素的顺序。
以下示例查询字段标签值是一个数组的所有文档,其中两个元素
'red'
和
'blank'
按指定顺序排列:
db.inventory.find({tags:["red","blank"]})
相反,如果您希望找到一个包含元素
red
和
blank
的数组,但不考虑数组中的顺序或其他元素,请使用
$all
运算符:
db.inventory.find({tags:{$all:["red","blank"]}})
查询数组元素
要查询数组字段是否包含至少一个具有指定值的元素,请使用过滤器
{ <field>: <value> }
其中
<value>
是元素值。
以下示例查询所有文档,其中
tags
是一个包含字符串
'red'
的数组:
//tags中存在“red”即匹配成功
db.inventory.find({tags:"red"})
要对数组字段中的元素指定条件,请在查询过滤器文档中使用查询运算符:
{<array field>:{<operator1>:<value1>,...}}
例如,以下操作查询数组 dim_cm 包含至少一个大于 25 的元素的所有文档:
//数组dim_cm中只要有一个元素大于25即为匹配成功
db.inventory.find({dim_cm:{$gt:25}})
多条件数组元素查询
在数组元素上指定复合条件时,您可以指定查询,使得单个数组元素满足这些条件或数组元素的任意组合满足条件。
1. 复合过滤条件查询数组元素
以下示例查询
dim_cm
数组包含以某种组合满足查询条件的元素的文档,多个条件之间的关系是
OR
。
例如,一个元素可以满足大于 15 的条件,而另一个元素可以满足小于 20 的条件,或者单个元素可以同时满足这两个条件:
//数组元素满足一个查询条件即可
db.inventory.find({dim_cm:{$gt:15,$lt:20}})
2. 查询满足多个条件的数组元素
使用
$elemMatch
算符对数组元素指定多个条件,以使至少一个数组元素满足所有指定条件,条件之间的关系是
AND
。
以下示例查询
dim_cm
数组包含至少一个大于 (
$gt
) 22** 且**小于 (
$lt
) 30 的元素的文档:
//数组元素必须同时满足多个查询条件
db.inventory.find({dim_cm:{$elemMatch:{$gt:22,$lt:30}}})
3. 按数组索引位置查询元素
使用点表示法,您可以在数组的特定索引或位置指定元素的查询条件。 该数组使用从零开始的索引。
使用点表示法查询时,字段和嵌套字段必须在引号内。
以下示例查询数组
dim_cm
中第二个元素大于 25 的所有文档:
db.inventory.find({"dim_cm.1":{$gt:25}})
4. 按数组长度查询数组
使用
$size
运算符按元素数查询数组。 例如,以下选择数组标签具有 3 个元素的文档。
db.inventory.find({"tags":{$size:3}})
版权归原作者 @魏大大 所有, 如有侵权,请联系我们删除。