首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用$subtract连同条件使用数组中的默认值(如果为null )?

如何使用$subtract连同条件使用数组中的默认值(如果为null )?
EN

Stack Overflow用户
提问于 2020-07-09 18:50:29
回答 1查看 241关注 0票数 2

我试图从聚合管道中的final数组和start数组中减去值。但是在减法之前,有一些特殊的情况需要一些额外的逻辑。

预期产出:

  1. 我需要从start数组的n个值减去final数组的第n个值。
  2. 然后,得到减去值的总和。

例外情况:

  1. 如果start数组的第n个值为NULL,则使用start_default值(来自查询)
  2. 如果final数组的第n个值为空,请使用final_default数组中的值。

经过一些聚合阶段之后,我的MongoDB文档具有以下格式:

假设start_default值=1,我已经注释了期望在每个组中执行减法的方式。

代码语言:javascript
运行
复制
{
  "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

代码语言:javascript
运行
复制
{
  "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]
        }
      ]
    }
  ]
}

如何实现这个用例?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 19:26:08

您可以从双重$map开始重写嵌套数组。您还需要$reduce,因为您将将数组转换为标量值。因为您需要“对”两个数组,所以有一个名为$zip的完美运算符,即使数组的长度不同,也可以使用它。第一个子文档的finalstart配对将返回:

代码语言:javascript
运行
复制
[ [ 6,2 ], [ 3, null ] ]

这很好,因为您可以使用$ifNull来提供默认值。

您的聚合如下所示:

代码语言:javascript
运行
复制
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 ] }
                                                        ]
                                                    }
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
])

蒙戈游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62821750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档