gpt4 book ai didi

mongodb - 蒙戈聚合 : Sum Count Field of Duplicate Array Value Field

转载 作者:可可西里 更新时间:2023-11-01 09:29:30 25 4
gpt4 key购买 nike

我有一大堆这样的文件:

{
_id: '1',
colors: [
{ value: 'red', count: 2 },
{ value: 'blue', count: 3}
]
shapes: [
{ value: 'cube', type: '3d' },
{ value: 'square', type: '2d'}
]
},
{
_id: '2',
colors: [
{ value: 'red', count: 7 },
{ value: 'blue', count: 34},
{ value: 'yellow', count: 12}
]
shapes: [
{ value: 'prism', type: '3d' },
{ value: 'triangle', type: '2d'}
]
}

通过使用 $unwind$addToSet,如下所示:

db.getCollection('coll').aggregate([{$unwind:"$colors"},{$unwind:"$shapes"},{$group:{_id:null,colors:{$addToSet:"$colors"},shapes:{$addToSet:"$shapes"}])

我可以得到以下信息:

{
"_id" : null,
"colors" : [
{ "value" : "red", "count" : 2 },
{ "value" : "blue", "count" : 3 },
{ "value" : "red", "count" : 7 },
{ "value" : "blue", "count" : 34 },
{ "value" : "yellow", "count" : 12 }
]
"shapes" : [
{ value: 'cube', type: '3d' },
{ value: 'square', type: '2d'}
{ value: 'prism', type: '3d' },
{ value: 'triangle', type: '2d'}
]
}

然而,我想要的是仅通过字段“值”来判断重复项,并对重复项的“计数”字段求和,即

{
"_id" : null,
"colors" : [
{ "value" : "red", "count" : 9 },
{ "value" : "blue", "count" : 37 },
{ "value" : "yellow", "count" : 12 }
]
"shapes" : [
{ value: 'cube', type: '3d' },
{ value: 'square', type: '2d'}
{ value: 'prism', type: '3d' },
{ value: 'triangle', type: '2d'}
]
}

question建议我可以使用 $colors.value 作为 _id 字段和 $sum 来计算 count 的总和。但是,因为我有第二个数组到 $unwind 和 aggregate/$group,所以我不确定执行此操作的最佳方法。

最佳答案

尝试运行以下聚合管道:

pipeline = [
{"$unwind": "$colors"},
{
"$group": {
"_id": "$colors.value",
"count": { "$sum": "$colors.count" },
"shapes": { "$first": "$shapes" }
}
},
{"$unwind": "$shapes"},
{
"$group": {
"_id": null,
"colors": {
"$addToSet": {
"value": "$_id",
"count": "$count"
}
},
"shapes": { "$addToSet": "$shapes" }
}
}
];
db.getCollection('coll').aggregate(pipeline)

示例输出

{
"result" : [
{
"_id" : null,
"colors" : [
{
"value" : "red",
"count" : 9
},
{
"value" : "blue",
"count" : 37
},
{
"value" : "yellow",
"count" : 12
}
],
"shapes" : [
{
"value" : "square",
"type" : "2d"
},
{
"value" : "cube",
"type" : "3d"
},
{
"value" : "triangle",
"type" : "2d"
},
{
"value" : "prism",
"type" : "3d"
}
]
}
],
"ok" : 1
}

请注意,文档 { value: 'yellow', count: '12'} 的计数值是一个字符串,在聚合中它将被打折为 0 值,因为 $sum 运算符有效地聚合数值,否则字符串值将累积为零默认值。


$group里面管道,您现在通过 $colors.value 字段对展平的颜色数组文档进行分组,然后使用累加器返回分组文档所需的聚合。累加器运算符 $first 用于此分组操作,因为当文档按定义的顺序排列时,它会从每个组的第一个文档返回一个值,在这种情况下,您希望在所有文档被分组时返回 shapes 字段。维护管道内文档的顺序更像是一种技巧。

这里要注意的一件事是在执行管道时,MongoDB 将操作符通过管道传递给彼此。这里的“管道”取Linux的意思:一个算子的输出成为后面算子的输入。每个运算符的结果是一个新的文档集合。所以Mongo执行之前的流水线如下:

collection | $unwind | $group | $unwind | $group => result

因此 $first 是从上一个管道到下一个管道获取形状字段所必需的。

关于mongodb - 蒙戈聚合 : Sum Count Field of Duplicate Array Value Field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35712751/

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