MongoDB SELECT字段,COUNT GROUP

时间:2014-04-17 14:19:23

标签: mongodb

我正在尝试做类似

的事情
SELECT province, COUNT(distinct id) FROM user GROUP BY province

所以得到像

这样的东西
province -> entries (unique to id)

但似乎证明真的很难。我最终得到了

db.user.aggregate([
    { $group: { _id: "$id"}  },
    { $group: { _id: "$province", count: { $sum: 1 } } } 
])

但是这给了我不同ID值的总数,而不是按省份分组。如何正确地将该查询转换为聚合函数?

示例文件。

{
    "_id" : ObjectId("534fd9f7b40801d50b8b4567"),
    "id" : "4",
    "province" : "on",
}

{
    "_id" : ObjectId("534fd9f7b40801d50b8b4567"),
    "id" : "4",
    "province" : "on",
}

应该返回

on - 1

因为有两行具有相同的“id”,所以我们只添加1。

2 个答案:

答案 0 :(得分:1)

provinceid上的第一组获取唯一组合,然后仅province分组以获得每idprovince s的计数:

db.test.aggregate([
    {$group: {_id: {province: '$province', id: '$id'}}},
    {$group: {_id: '$_id.province', count: {$sum: 1}}}
])

得出结果:

{
    "result" : [ 
        {
            "_id" : "on",
            "count" : 1
        }
    ],
    "ok" : 1
}

答案 1 :(得分:0)

获得所需结果的一种方法是使用$addToSet运算符,该运算符仅用于向数组添加唯一值。完整的查询如下所示:

db.user.aggregate([
    // Group by "province" and add unique values of "id" to array
    { $group: { 
        _id: "$province", 
        id: { $addToSet: "$id" } 
    }}, 
    // De-normalize the array into separate documents
    {$unwind:"$id"}, 
    // Get the distinct count
    {$group:{_id:"$_id", count:{$sum:1}}}
])

如果您使用的是MongoDB 2.6,您还可以使用$size聚合运算符来获取id数组的大小。