我试图从聚合管道中的final
数组和start
数组中减去值。但是在减法之前,有一些特殊的情况需要一些额外的逻辑。
预期产出:
start
数组的n个值减去final
数组的第n个值。例外情况:
start
数组的第n个值为NULL,则使用start_default值(来自查询)final
数组的第n个值为空,请使用final_default
数组中的值。经过一些聚合阶段之后,我的MongoDB文档具有以下格式:
假设start_default值=1,我已经注释了期望在每个组中执行减法的方式。
{
"data": [
{
"key": "TP-1",
"status_map": [
{
"status": "Closed",
"final": [
6,
3
], // Expected Output
"start": [ // sum:6 [(6-2)+(3-1(start_default))=4+2]
2
],
"final_default": [
4
]
},
{
"status": "Done",
"final": [
4
], // Expected Output
"start": [ // sum:2 [(4-3)+(2(final_default)-1)=1+1]
3,
1
],
"final_default": [
2
]
}
]
},
{
"key": "TP-2",
"status_map": [
{
"status": "Closed",
"final": [
1,
5
], // Expected Output
"start": [], //sum:4 [(1-1(start_default))+(5-1(start_default))=0+4]
"final_default": [
3
]
},
{
"status": "Done",
"final": [], // Expected Output
"start": [ //sum:3 [(5(final_default)-3)+(5(final_default)-4)=2+1]
3,
4
],
"final_default": [
5
]
}
]
}
]
}
这是我的预期输出,假设start_default
值=1
{
"data": [
{
"key": "TP-1",
"status_map": [
{
"status": "Closed",
"sum": 6 //[(6-2)+(3-1(start_default))=4+2]
{
"status": "Done",
"sum": 2 //[(4-3)+(2(final_default)-1)=1+1]
}
]
},
{
"key": "TP-2",
"status_map": [
{
"status": "Closed",
"sum": 4 //[(1-1(start_default))+(5-1(start_default))=0+4]
},
{
"status": "Done",
"sum": 3 //[(5(final_default)-3)+(5(final_default)-4)=2+1]
}
]
}
]
}
如何实现这个用例?
发布于 2020-07-09 19:26:08
您可以从双重$map开始重写嵌套数组。您还需要$reduce,因为您将将数组转换为标量值。因为您需要“对”两个数组,所以有一个名为$zip的完美运算符,即使数组的长度不同,也可以使用它。第一个子文档的final
和start
配对将返回:
[ [ 6,2 ], [ 3, null ] ]
这很好,因为您可以使用$ifNull来提供默认值。
您的聚合如下所示:
db.collection.aggregate([
{
$project: {
data: {
$map: {
input: "$data",
as: "d",
in: {
key: "$$d.key",
status_map: {
$map: {
input: "$$d.status_map",
as: "sm",
in: {
status: "$$sm.status",
sum: {
$reduce: {
input: {
$zip: {
inputs: [ "$$sm.final", "$$sm.start" ],
useLongestLength: true
}
},
initialValue: 0,
in: {
$add: [
"$$value",
{
$subtract: [
{ $ifNull: [ { $arrayElemAt: [ "$$this", 0 ] }, { $arrayElemAt: [ "$$sm.final_default" , 0] } ] },
{ $ifNull: [ { $arrayElemAt: [ "$$this", 1 ] }, 1 ] }
]
}
]
}
}
}
}
}
}
}
}
}
}
}
])
https://stackoverflow.com/questions/62821750
复制相似问题