MongoDB聚合统计数组符合条件元素数量报错求助
解决MongoDB聚合统计数组符合条件元素数量的问题
嘿,你遇到的这个错误其实很好理解——当你用$unwind拆分数组后,原来的$Array字段已经从数组变成了单个的对象,这时候再用$size去处理它,自然会报错说“参数不是数组”啦。我给你两种靠谱的解决方案,帮你搞定这个统计需求:
方法一:用$filter+$size直接统计(推荐,效率更高)
这种方法不需要拆分数组,直接在单个$project阶段完成过滤和统计,性能更好,尤其适合数组元素较多的场景:
db.collection.aggregate([ { $project: { _id: 0, matchingCount: { // 先过滤出field1等于"a"的数组元素 $size: { $filter: { input: "$Array", cond: { $eq: ["$$this.field1", "a"] } } } } } } ])
原理很简单:$filter会遍历你的Array数组,把所有满足field1: "a"的元素筛选出来组成一个新数组,然后$size直接统计这个新数组的长度,就是你要的符合条件的元素数量。
方法二:如果一定要用$unwind,用$count统计文档数
如果你因为某些原因必须拆分数组,那可以在$match之后用$count来统计匹配后的文档总数——因为$unwind会把每个数组元素拆成一个独立的文档,所以匹配后的文档数就是符合条件的元素数量:
db.collection.aggregate([ { $unwind: "$Array" }, // 拆分数组,每个元素变成单独文档 { $match: { "Array.field1": "a" } }, // 筛选符合条件的文档 { $count: "matchingCount" } // 统计数量,结果字段名为matchingCount ])
这里不需要includeArrayIndex(除非你真的需要索引值),而且最后用$count替代你原来的$project,就能得到正确的统计结果。
为什么你的原代码会报错?
再回头看你的代码:$unwind之后,每个输出文档里的$Array已经不是数组了,而是数组中的某一个具体对象(比如{field1: "a", field2: "..."}),这时候$size要求参数是数组,自然就触发了错误提示。
内容的提问来源于stack exchange,提问作者Andrea Cristiani
相关产品推荐
相关产品推荐

