如何在MongoDB中获取仅含多方向计数的无键结果并将空计数项补0
调整MongoDB聚合查询实现目标数组输出
我来帮你修改这个聚合查询,刚好能实现你想要的仅含数值的数组结果,同时为空计数补0的需求~
方法一:基于你现有代码修改(改动最小)
直接在你原来的管道后面加几步处理,就能得到[1, 0, 0, 1]这种格式:
[ { "$facet": { "N": [ { "$match": { "province": "North" }}, { "$count": "N" } ], "E": [ { "$match": { "province": "East" }}, { "$count": "E" } ], "S": [ { "$match": { "province": "South" }}, { "$count": "S" } ], "W": [ { "$match": { "province": "West" }}, { "$count": "W" } ] }}, { "$project": { // 用$ifNull把空计数补成0 "N": { "$ifNull": [ { "$arrayElemAt": ["$N.N", 0] }, 0 ] }, "E": { "$ifNull": [ { "$arrayElemAt": ["$E.E", 0] }, 0 ] }, "S": { "$ifNull": [ { "$arrayElemAt": ["$S.S", 0] }, 0 ] }, "W": { "$ifNull": [ { "$arrayElemAt": ["$W.W", 0] }, 0 ] } }}, { "$project": { "_id": 0, // 按北、东、南、西的顺序打包成数组 "result": ["$N", "$E", "$S", "$W"] }}, { "$replaceRoot": { "newRoot": "$result" } } ]
关键改动说明:
- 在第二个
$project里用$ifNull判断:如果某个方向没有匹配到文档(返回的是null),就自动替换成0,解决空计数补0的问题。 - 新增的
$project把四个方向的计数按你需要的顺序放进数组result。 - 最后用
$replaceRoot把数组直接作为输出的根文档,这样就得到无键的纯数值数组了。
方法二:更灵活的通用统计方式(适合方向可能扩展的场景)
如果以后可能新增其他方向,这种方式不用修改多个$match,只需要调整字段映射即可:
[ // 先统计所有存在的方向的计数 { "$group": { "_id": "$province", "count": { "$sum": 1 } }}, // 把统计结果转成键值对数组 { "$group": { "_id": null, "counts": { "$push": { "k": "$_id", "v": "$count" } } }}, // 键值对转成对象 { "$replaceRoot": { "newRoot": { "$arrayToObject": "$counts" } }}, // 补全所有方向的计数,空的补0 { "$project": { "N": { "$ifNull": ["$North", 0] }, "E": { "$ifNull": ["$East", 0] }, "S": { "$ifNull": ["$South", 0] }, "W": { "$ifNull": ["$West", 0] } }}, // 转成目标数组格式 { "$project": { "_id": 0, "result": ["$N", "$E", "$S", "$W"] }}, { "$replaceRoot": { "newRoot": "$result" } } ]
两种方式都能得到你想要的[1, 0, 0, 1]结果,你可以根据自己的场景选~
内容的提问来源于stack exchange,提问作者techshot nextgen
相关产品推荐
相关产品推荐

