如何用MongoDB聚合统计map类型usage下各seats数组的长度?
解决方案
要处理动态键的usage字段并统计每个seats数组的长度,你需要先将对象转换为可遍历的键值对数组,处理后再还原为对象结构。以下是符合需求的聚合查询:
db.seats.aggregate([ { $addFields: { usage: { $arrayToObject: { $map: { input: { $objectToArray: "$usage" }, as: "item", in: { k: "$$item.k", v: { total: { $size: "$$item.v.seats" } } } } } } } } ])
关键步骤说明:
$objectToArray: 将usage这个动态键对象转换成[{k: "键名", v: 对应值}]格式的数组,这样就能遍历所有不确定的键名。$map: 遍历转换后的数组,对每个元素做两件事:保留原键名,将值替换为包含total的对象,用$size计算seats数组的长度。$arrayToObject: 把处理后的键值对数组重新转回对象结构,还原成你需要的usage层级。$addFields: 用处理后的新usage字段覆盖原文档中的对应字段。
处理特殊情况(可选)
如果存在子对象没有seats数组或seats不是数组的情况,可以添加判断逻辑返回默认值:
db.seats.aggregate([ { $addFields: { usage: { $arrayToObject: { $map: { input: { $objectToArray: "$usage" }, as: "item", in: { k: "$$item.k", v: { total: { $cond: { if: { $isArray: "$$item.v.seats" }, then: { $size: "$$item.v.seats" }, else: "NA" } } } } } } } } } ])
为什么你的原查询不生效?
聚合表达式不支持usage.*.seats这种通配符语法,无法直接通过通配符遍历动态键。必须先将对象转换为数组,才能对每个动态键对应的内容进行处理。
内容的提问来源于stack exchange,提问作者Alko
相关产品推荐
相关产品推荐

