MongoDB中如何统计集合内嵌数组的布尔真值数量并按job分组
问题原因
你原有查询的$cond条件使用了MongoDB查询文档的匹配语法,而非聚合表达式的字段取值判断语法,导致所有展开的labellers元素都被判定为满足条件,最终统计值等于所有展开后的数组元素总数量(你的示例里就是4条),不符合预期。
正确聚合查询(基于原有写法修正)
db.collection.aggregate([ { $unwind: "$labellers" }, { $group: { _id: "$job", count: { $sum: { $cond: [ { $eq: ["$labellers.completed", true] }, 1, 0 ] } } } } ])
更优写法(无需$unwind,性能更高)
如果集合数据量较大,推荐用$filter+$size的组合先单文档统计符合条件的标注数,再分组求和,避免数组展开带来的性能损耗:
db.collection.aggregate([ { $addFields: { completedCount: { $size: { $filter: { input: "$labellers", cond: { $eq: ["$$this.completed", true] } } } } } }, { $group: { _id: "$job", count: { $sum: "$completedCount" } } } ])
两种写法执行后都会输出你预期的结果:
{ "_id": ObjectId("612370c1abbe777ae8d8c0eb"), "count": 3 }
内容的提问来源于stack exchange,提问作者AlexV101
相关产品推荐
相关产品推荐

