gpt4 book ai didi

mongodb - 如何聚合数组中的百分比?

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

我正在尝试弄清楚如何实现聚合,我可以在最后手动将 unwindgroup 组合在一起,但我确定我应该能够以更简洁的方式实现这一点,所以我想在遇到困难时将其丢弃。

我的文档结构(跳过不感兴趣的部分)如下所示:

{
_id: ObjectId,
panels: [
{
visConfig: {
dataConfig: {
columns: [
{ element: "DX" },
{ element: "SE" },
]
}
}
},
{
visConfig: {
dataConfig: {
columns: [
{ element: "AB" },
{ element: "XY" },
]
}
}
}
]
}

我想做的是计算 元素 与要提供的给定集合重叠的百分比。因此,例如对于显示的文档,它将为集合 ["DX"] 生成 25% 或为集合 生成 50% ["DX", "AB"].

所以我尝试了一些方法,我想我已经选择了最近的方法:

$project: {
_id: 1,
total: { $sum: { $size: "$panels.visConfig.dataConfig.columns" } }
}

但是我在这里遇到一个我不明白的错误:

The argument to $size must be an array, but was of type: missing

然后我的条件聚合也有问题,它似乎为所有元素值返回 0。

{
_id: 1,
"panels.visConfig.dataConfig.columns.element": {
$sum: {
$cond: [{
$setIsSubset: [
["DX"], ["$panels.visConfig.dataConfig.columns.element"]
]
}, 1, 0 ],
}
},
}

最佳答案

您可以在 3.4 版本中尝试以下聚合。

db.colname.aggregate([
{"$project":{
"_id":1,
"total":{
"$reduce":{
"input":"$panels.visConfig.dataConfig.columns.element",
"initialValue":0,
"in":{"$add":["$$value",{"$size":"$$this"}]}
}},
"match":{
"$sum":{
"$map":{
"input":"$panels.visConfig.dataConfig.columns.element",
"in":{
"$size":{
"$setIntersection":[["DX","AB"],"$$this"]
}
}
}
}
}
}},
{"$project":{
"_id":1,
"percent":{"$multiply":[{"$divide":["$match","$total"]}, 100]}
}}])

更新 - 您可以在 $reduce 管道中执行匹配和总计计算。

db.colname.aggregate([
{"$project":{
"_id":1,
"stats":{
"$reduce":{
"input":"$panels.visConfig.dataConfig.columns.element",
"initialValue":{"total":0,"match":0},
"in":{
"total":{"$add":["$$value.total",{"$size":"$$this"}]},
"match":{"$add":["$$value.match",{"$sum":{"$map":{"input":"$$this","in":{"$cond":[{"$in":["$$this", ["DX","AB"]] }, 1, 0]}}}}]}

}
}}
}},
{"$project":{
"_id":1,
"percent":{"$multiply":[{"$divide":["$stats.match","$stats.total"]}, 100]}
}}])

关于mongodb - 如何聚合数组中的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617853/

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