MongoDB中数组转Map后如何按items元素数量查询?
查询MongoDB中Map结构字段的元素数量
好问题!当你把数组转成键值对的Map(对象)结构后,确实没办法像数组那样直接用$size操作符来查询元素数量,但MongoDB提供了几个简洁的方案来实现这个需求:
方法1:使用聚合管道(适用于所有支持聚合的MongoDB版本)
通过$objectToArray操作符将Map结构转换为数组,再用$size获取数组长度,最后匹配目标数量:
db.collection.aggregate([ { $match: { $expr: { $eq: [ { $size: { $objectToArray: "$items" } }, 7 ] } } } ])
代码解释:
$objectToArray: "$items":把items这个Map结构转成数组,每个元素格式为{ "k": "键名", "v": "对应的值" }$size: ...:计算转换后数组的长度,也就是Map里的键值对数量$eq: [..., 7]:判断长度是否等于目标数量(这里是7),匹配符合条件的文档
方法2:直接在find查询中使用$expr(MongoDB 4.4+支持)
如果你用的是MongoDB 4.4及以上版本,可以直接在find里用$expr表达式,写法更简洁:
db.collection.find({ $expr: { $eq: [ { $size: { $objectToArray: "$items" } }, 7 ] } })
额外提醒
看你提供的示例,原数组里有两个id:"AB-03"的元素,但转换后的Map里出现了AB-03和AB-04,这应该是笔误吧?实际场景中,当数组转Map时,重复的键会被后面的元素覆盖,导致数据丢失,这个点要特别注意哦!
内容的提问来源于stack exchange,提问作者curiousone
相关产品推荐
相关产品推荐

