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默认值
    数组中的值
  • 经过一些聚合阶段后,我的MongoDB文档具有以下格式:

    假设start_默认值=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]
            }
          ]
        }
      ]
    }
    
    我已经评论了我希望在每组中执行减法的方式

    这里是我的预期输出,假设
    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你是个和蔼可亲的人!!非常感谢你。