Mongodb 如果为空,如何使用$subtract和条件从数组中使用默认值?
我试图从聚合管道中的Mongodb 如果为空,如何使用$subtract和条件从数组中使用默认值?,mongodb,mongodb-query,aggregation-framework,aggregation,subtraction,Mongodb,Mongodb Query,Aggregation Framework,Aggregation,Subtraction,我试图从聚合管道中的final数组和start数组中减去值。但在某些特殊情况下,减法之前需要一些额外的逻辑 预期产出: 我需要从final数组的第n个值中减去start数组的第n个值 然后,得到减去的值的总和 例外情况: 如果start数组的第n个值为空,则使用start\u默认值(来自查询) 如果final数组的第n个值为空,则使用final\u默认值数组中的值 经过一些聚合阶段后,我的MongoDB文档具有以下格式: 假设start_默认值=1 { "data": [
final
数组和start
数组中减去值。但在某些特殊情况下,减法之前需要一些额外的逻辑
预期产出:
final
数组的第n个值中减去start
数组的第n个值start
数组的第n个值为空,则使用start\u默认值(来自查询)final
数组的第n个值为空,则使用final\u默认值
数组中的值{
"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]
}
]
}
]
}
我已经评论了我希望在每组中执行减法的方式
这里是我的预期输出,假设start\u default
value=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]
}
]
}
]
}
如何实现此用例?您可以从double开始重写嵌套数组。由于要将数组转换为标量值,因此还需要。因为您需要“配对”两个数组,所以有一个称为的完美运算符,即使数组的长度不同,也可以使用它。第一个子文档的配对final
和start
将返回:
[ [ 6,2 ], [ 3, null ] ]
这很好,因为您可以使用提供默认值
您的聚合可以如下所示:
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 ] }
]
}
]
}
}
}
}
}
}
}
}
}
}
}
])
@mickl你是个和蔼可亲的人!!非常感谢你。