gpt4 book ai didi

Mongodb:聚合:在 $group 之前对数组中的值求和

转载 作者:行者123 更新时间:2023-12-02 15:24:06 26 4
gpt4 key购买 nike

我有一组具有以下结构的文档:

{
_id: 1,
array: [
{value: 10 },
{value: 11 },
{value: 12 }
]
}

我想对集合进行聚合查询:得到每个项目的比例。 (例如,项目 1 的比例将是项目 1 的 value 除以所有三个项目的值之和。

注意:我想在单个查询中执行此操作。

最佳答案

这里的基本思路是$unwind数组,$group文档,然后应用于每个数组成员。由于 $map,这对 MongoDB 2.6 或更高版本更有效运算符(operator):

db.collection.aggregate([
{ "$unwind": "$array" },
{ "$group": {
"_id": "$_id",
"array": { "$push": "$array" },
"total": { "$sum": "$array.value" }
}},
{ "$project": {
"array": {
"$map": {
"input": "$array",
"as": "el",
"in": {
"value": "$$el.value",
"prop": {
"$divide": [ "$$el.value", "$total" ]
}
}
}
}
}}
])

或早期版本:

db.collection.aggregate([
{ "$unwind": "$array" },
{ "$group": {
"_id": "$_id",
"array": { "$push": "$array" },
"total": { "$sum": "$array.value" }
}},
{ "$unwind": "$array" },
{ "$group": {
"_id": "$_id",
"array": {
"$push": {
"value": "$array.value",
"prop": {
"$divide": [ "$array.value", "$total" ]
}
}
}
}}
])

在任何一种情况下,如果您实际上没有“聚合”文档之外的任何内容,那么在客户端代码中执行此计算要高效得多。由于其作用,此处的 $unwind 可能会变得非常昂贵。

此外,如果您只是将“总计”存储为另一个元素,那么简单的 $project 就是您所需要的全部,它本身的成本非常低。保持更新总数只是 $inc 的简单用法。运营商如你$push数组的新元素。

关于Mongodb:聚合:在 $group 之前对数组中的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31831784/

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