MongoDB用aggregate做count无匹配返回空,如何对齐SQL返回0的行为
调整后的MongoDB聚合语句实现方案
你之前的写法中,如果$match阶段没有命中任何文档,后续的$count阶段不会生成输出,因此会返回空结果。可以通过$facet阶段兜底实现无匹配时返回0的效果,调整后的语句如下:
db.collection.aggregate([ { $facet: { // 把原有匹配和统计逻辑放到facet的子管道中 matched_docs: [ { $match: { key: 1 } }, { $count: "total" } ] } }, { $project: { _id: 0, // 取匹配到的统计值,为空时默认返回0 s: { $ifNull: [ { $first: "$matched_docs.total" }, 0 ] } } } ])
原理说明
$facet阶段不管子管道有没有命中文档,都会固定输出一个外层文档,不会出现空输出的情况- 用
$first取出子管道返回的统计值,如果子管道没有返回结果(即无匹配文档),$ifNull会兜底返回0,和SQLcount(*)的行为完全一致
内容的提问来源于stack exchange,提问作者dabal
相关产品推荐
相关产品推荐

