我正在尝试做类似
的事情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。
答案 0 :(得分:1)
province
和id
上的第一组获取唯一组合,然后仅province
分组以获得每id
个province
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
数组的大小。