gpt4 book ai didi

MongoDB 聚合嵌套分组

转载 作者:可可西里 更新时间:2023-11-01 10:08:57 25 4
gpt4 key购买 nike

我有 Assets 集合,其中包含类似的数据

{
"_id" : ObjectId("5bfb962ee2a301554915"),
"users" : [
"abc.abc@abc.com",
"abc.xyz@xyz.com"
],
"remote" : {
"source" : "dropbox",
"bytes" : 1234
}
{
"_id" : ObjectId("5bfb962ee2a301554915"),
"users" : [
"pqr.pqr@pqr.com",
],
"remote" : {
"source" : "google_drive",
"bytes" : 785
}
{
"_id" : ObjectId("5bfb962ee2a301554915"),
"users" : [
"abc.abc@abc.com",
"abc.xyz@xyz.com"
],
"remote" : {
"source" : "gmail",
"bytes" : 5647
}

我正在寻找的是按用户分组并根据其来源获取总字节数

{
"_id" : "abc.abc@abc.com",
"bytes" : {
"google_drive": 1458,
"dropbox" : 1254
}
}

我不知道如何使用分组获取嵌套输出。我试过查询

db.asset.aggregate(
[
{$unwind : '$users'},
{$group:{
_id:
{'username': "$users",
'source': "$remote.source",
'total': {$sum: "$remote.bytes"}} }
}
]
)

这样我就得到了重复用户名的结果。

最佳答案

使用 MongoDb 3.6 和更新版本,您可以利用 $arrayToObject $mergeObjects 中的 运算符 表达式和一个 $replaceRoot 管道以获得所需的结果。

不过,您需要运行以下聚合管道:

db.asset.aggregate([
{ "$unwind": "$users" },
{ "$group": {
"_id": {
"users": "$users",
"source": "$remote.source"
},
"totalBytes": { "$sum": "$remote.bytes" }
} },
{ "$group": {
"_id": "$_id.users",
"counts": {
"$push": {
"k": "$_id.source",
"v": "$totalBytes"
}
}
} },
{ "$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{ "bytes": { "$arrayToObject": "$counts" } },
"$$ROOT"
]
}
} },
{ "$project": { "counts": 0 } }
])

产生

/* 1 */
{
"bytes" : {
"gmail" : 5647.0,
"dropbox" : 1234.0
},
"_id" : "abc.abc@abc.com"
}

/* 2 */
{
"bytes" : {
"google_drive" : 785.0
},
"_id" : "pqr.pqr@pqr.com"
}

/* 3 */
{
"bytes" : {
"gmail" : 5647.0,
"dropbox" : 1234.0
},
"_id" : "abc.xyz@xyz.com"
}

使用上述示例文档。

关于MongoDB 聚合嵌套分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53689666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com