MongoDB嵌入式文档统计:查询含params="abc"的文档数量
MongoDB动态键嵌入式文档的统计方案
解决思路
由于actions下的子键名不固定、数量不确定,没法直接指定键名查询,核心办法是先把这个动态键的对象转换成数组格式,再遍历数组里的所有任务条目,判断是否存在params="abc"的情况。
具体实现
方式一:用聚合管道统计总数
通过聚合操作一步步处理,先匹配符合条件的文档,再统计数量:
db.collection.aggregate([ { $match: { $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$actions" }, as: "actionItem", in: { $anyElementTrue: { $map: { input: "$$actionItem.v", as: "task", in: { $eq: ["$$task.params", "abc"] } } } } } } } } }, { $count: "符合条件的文档总数" } ])
方式二:直接用countDocuments快速统计
如果不需要复杂的聚合操作,直接用countDocuments配合表达式查询更简洁:
db.collection.countDocuments({ $expr: { $anyElementTrue: { $map: { input: { $objectToArray: "$actions" }, as: "entry", in: { $anyElementTrue: { $map: { input: "$$entry.v", as: "task", in: { $eq: ["$$task.params", "abc"] } } } } } } } })
关键步骤说明
$objectToArray: "$actions":把actions这个键名不固定的对象转成[{k: "动态键名", v: 对应任务数组}]的数组结构,这样就能遍历所有动态键。- 两层
$map:外层遍历每个动态键对应的任务数组,内层遍历数组里的每个任务,判断该任务的params是否等于abc。 $anyElementTrue:只要有任意一个任务满足params="abc",就判定整个文档符合统计条件。
内容的提问来源于stack exchange,提问作者Dror
相关产品推荐
相关产品推荐

