使用$ group时是否可以列出不存在的组?

时间:2016-08-16 19:23:41

标签: node.js mongodb mongoose nosql

如果我想从我的节点服务器(使用mongoosoe)对mongodb集合执行$ group和$ sum,是否可以为非现有组返回0? 该集合包含以下字段:ssn,name,gender,city。

        model.aggregate([
        {
            $group : { _id : { city:"$city", gender:"$gender"}, count{ $sum:1 }}
        }], function (err,result) {
                if(err) {
                    //err
                }
                else{
                    //response
                }
        });

如果城市中有两种性别的人 - 查询将返回:

{
"_id" : {
    "city" : "NY",
    "gender" : "male"
},
"count" : 11
},
{
"_id" : {
    "city" : "NY",
    "gender" : "female"
},
"count" : 31
}

但如果一个城市没有一个性别的人,则不会返回任何价值。例如洛杉矶没有男性:

{
"_id" : {
    "city" : "LA",
    "gender" : "female"
},
"count" : 53
}

是否可以使查询返回给定方案的以下结果,而不包含城市和人口数量的集合?

{
"_id" : {
    "city" : "LA",
    "gender" : "male"
},
"count" : 0
},    
{
"_id" : {
    "city" : "LA",
    "gender" : "female"
},
"count" : 53
}

感谢,

1 个答案:

答案 0 :(得分:1)

如果可能的值是有限的且在您的示例中已知,您可以使用 $ cond 将男性和女性的计数合并为每个城市的一个文档,如下所示:

[
    {
        $group : {
            _id: {
                city:"$city"
            }, 
            males:{
                $sum: {
                    $cond: {if: {$eq:["$gender", "male"]}, then: 1, else: 0}
                } 
            }, 
            females:{
                $sum: {
                    $cond: {if: {$eq:["$gender", "female"]}, then: 1, else: 0}
                } 
            }
        }
    }
]