MongoDB 按多个字段聚合分组
MongoDB aggregate group by multiple fields
示例文档
{
"user_id": "1",
"key": "key1"
},
{
"user_id": "1",
"key": "key2"
},
{
"user_id": "2",
"key": "key1"
},
{
"user_id": "2",
"key": "key1"
},
{
"user_id": "3",
"key": "key2"
},
{
"user_id": "4",
"key": "key1"
}
如果我只想按 key
字段分组,我可以使用下面的查询。
db.test.aggregate([
{
$group: {
_id: {
"key": $key"
},
count: {
$sum: 1
}
}
},
{
$sort: {"count":-1}
},
])
它将按 key
分组并按 key
的计数排序。
但是,从上述文档中可以看出,存在单个用户具有重复密钥的情况。
因此,我不得不以user_id
字段为目标进行分组
预期数据:
{"key": "key1", "count": 3}
{"key": "key2", "count": 2}
如何对多个字段进行分组?
谢谢。
$group
by key
并构造数组 os unique user_id
by $addToSet
operator
$size
获取 user_id
中的总元素
db.test.aggregate([
{
$group: {
_id: "$key",
count: { $addToSet: "$user_id" }
}
},
{ $addFields: { count: { $size: "$count" } } },
{ $sort: { count: -1 } }
])
第二个pos理解$group
阶段的合理方式,
$group
两个字段 key
和 user_id
$group
by the only key and get a sum of the count
db.test.aggregate([
{
$group: {
_id: {
key: "$key",
user_id: "$user_id"
}
}
},
{
$group: {
_id: "$_id.key",
count: { $sum: 1 }
}
},
{ $sort: { count: -1 } }
])
示例文档
{
"user_id": "1",
"key": "key1"
},
{
"user_id": "1",
"key": "key2"
},
{
"user_id": "2",
"key": "key1"
},
{
"user_id": "2",
"key": "key1"
},
{
"user_id": "3",
"key": "key2"
},
{
"user_id": "4",
"key": "key1"
}
如果我只想按 key
字段分组,我可以使用下面的查询。
db.test.aggregate([
{
$group: {
_id: {
"key": $key"
},
count: {
$sum: 1
}
}
},
{
$sort: {"count":-1}
},
])
它将按 key
分组并按 key
的计数排序。
但是,从上述文档中可以看出,存在单个用户具有重复密钥的情况。
因此,我不得不以user_id
字段为目标进行分组
预期数据:
{"key": "key1", "count": 3}
{"key": "key2", "count": 2}
如何对多个字段进行分组?
谢谢。
$group
bykey
并构造数组 os uniqueuser_id
by$addToSet
operator$size
获取user_id
中的总元素
db.test.aggregate([
{
$group: {
_id: "$key",
count: { $addToSet: "$user_id" }
}
},
{ $addFields: { count: { $size: "$count" } } },
{ $sort: { count: -1 } }
])
第二个pos理解$group
阶段的合理方式,
$group
两个字段key
和user_id
$group
by the only key and get a sum of the count
db.test.aggregate([
{
$group: {
_id: {
key: "$key",
user_id: "$user_id"
}
}
},
{
$group: {
_id: "$_id.key",
count: { $sum: 1 }
}
},
{ $sort: { count: -1 } }
])