MongoDB中数组字段的查询

本文介绍了在MongoDB中如何对数组类型字段进行查询操作,包括精确匹配整个数组、匹配数组的某个元素、多条件匹配、指定位置元素查询以及根据数组长度查询。示例数据为库存表inventory,展示了各种查询语法的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组在mongodb中属于常用的数据,下面以库存表inventary为例,对数组查询的操作做一些介绍,你可以用下面的数据和方法做一些练习或验证。
打开MongoDB Shell,运行下面的命令,插入一些数据:

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>是完整的数组,并且值和顺序都要一致。例如:

db.inventory.find( { tags: ["red", "blank"] } )

结果只会匹配到"notebook"
如果要忽略掉数组元素的顺序可以使用$all操作,例如:

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

使用$all就可以匹配到"notebook""planner"

匹配数组的某个元素

如果要查询数组包含某个元素的文档,可以使用{<field>:<value>}的筛选条件,其中value是数组的某个元素,例如:
要查询字段tag中包含"red"元素的数组,可以这么写:

db.inventory.find( { tags: "red" } )

如果要对数组元素进行条件筛选,可以使用查询操作符

{<array field>: {<operator1>: <value1>, ...} }

比如,要筛选出dim_cm数组字段中有大于25的元素的文档:

db.inventory.find( { dim_cm: { $gt: 25 } } )

数组的多条件匹配

在对数组进行复核条件查询时,可以用单个或多个数组元素进行条件组合。

AND关系的多个条件查询

例如要筛选出dim_cm字段数组中,一个元素大于15,且另一个元素小于20,可以这么写:

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

OR关系的多条件匹配

可以使用$elemMatch操作符对数组元素查询指定多个条件,这些条件是或的关系,只要有一个满足即可。
例如,要查询dim_cm数组中元素大于($gt) 22或小于($lt) 30的文档,可以这么写:

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

指定位置数组元素的查询

可以通过点符号<array field.x>来指定某个位置的数组元素进行查询,其中的x是数组元素的位置,从0开始。
当使用点符号进行查询时,字段和嵌套字段必须在引号内。
例如,要查询数组dim_cm中第二个元素大于25的文档,可以这么写:

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )

根据数组长度进行查询

使用$size操作符,可以根据数组元素数量进行查询。
例如,要查询有数组字段tag有3个元素的文档,可以这么写:

db.inventory.find( { "tags": { $size: 3 } } )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值