gpt4 book ai didi

java - 根据位置百分比进行分组和求和 MongoDb 聚合

转载 作者:行者123 更新时间:2023-12-02 02:23:19 25 4
gpt4 key购买 nike

我必须按 myArray 的值进行分组,并使用不同的属性对总数进行求和,这意味着例如对于本文档,我们应该进行分配,使数组的第一个值占总数的 40%,其余 40%最后占总数的(2/5),其他人平分20%(1/5):

/* 1 */
{
"_id" : ObjectId("5a535c48a4d86ed94a7e8618"),
"total" : 5.8,
"myArray" : [
{
"value" : "a" 2/5 (40%)
},
{
"value" : "b 1/20 (20% /4)
},
{
"value" : "a" 1/20 (20% / 4)
},
{
"value" : "c" 1/20 (20% / 4)
},
{
"value" : "a" 1/20 (20% / 4)
},
{
"value" : "a" 2/5 (40%)
}
]
}



/* 2 */
{
"_id" : ObjectId("5a535c48a4d86ed94a7e8619"),
"total" : 4.5,
"myArray" : [
{
"value" : "a" 2/5 (40%)
},
{
"value" : c" 1/5 (20%)
},
{
"value" : "c" 2/5 (40%)
}
]
}

在这个例子中我们必须得到:

"a" -> 2/5 * 5.8 + 2/5 * 5.8 + 1/10*5.8 + 1/10*5.8  2/5 * 4.5 / "b" -> 1/20*5.8 +0*4.5 / "c" -> 1/20*5.8 + 1/5*4.5 + 2/5*4.5 

结果必须是这样的:

[
{
"_id": "a",
"total": 2/5 * 5.8 + 2/5 * 5.8 + 1/10*5.8 + 1/10*5.8 2/5 * 4.5
},
{
"_id": "b",
"total": 1/20*5.8
},
{
"_id": "c",
"linear_total": 1/20*5.8 + 1/5*4.5 + 2/5*4.5
}
]

我必须按 Path.value 进行分组,并使用此逻辑对每个数组中的对应值求和

非常感谢您的帮助

最佳答案

您可以在 3.4 管道中尝试以下聚合。

根据元素位置分配权重。

$switch 案例根据数组大小提供不同的权重。

db.col.aggregate([{"$addFields":{
"myArray":{
"$switch":{
"branches":[{
"case":{"$gt":[{"$size":"$myArray"},2]},
"then":{"$concatArrays":[
[{"value":{"$arrayElemAt":["$myArray.value",0]},"weight":{"$divide":[2,5]}}],
{"$map":{
"input":{"$slice":["$myArray",1,{"$subtract":[{"$size":"$myArray"},2]}]},
"as":"val",
"in":{"value":"$$val.value","weight":{"$divide": [{"$divide":[1,5]},{"$subtract":[{"$size":"$myArray"},2]} ]}}
}},
[{"value":{"$arrayElemAt":["$myArray.value",-1]},"weight":{"$divide":[2,5]}}]
]}
},
{
"case":{"$eq":[{"$size":"$myArray"},2]},
"then":{"$concatArrays":[
[{"value":{"$arrayElemAt":["$myArray.value",0]},"weight":{"$divide":[1,2]}}],
[{"value":{"$arrayElemAt":["$myArray.value",-1]},"weight":{"$divide":[1,2]}}]
]}
}],
"default":{"$concatArrays":[
[{"value":{"$arrayElemAt":["$myArray.value",0]},"weight":1}],
]}}
}
}},
{"$unwind":"$myArray"},
{"$group":{
"_id":"$myArray.value",
"linear_total":{"$sum":{"$multiply":["$myArray.weight","$total"]}}
}},
{"$sort":{"_id":1}}])

关于java - 根据位置百分比进行分组和求和 MongoDb 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48167667/

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