【问题标题】:How to convert deeply nested array with one object to object in mongodb aggregation?如何将具有一个对象的深度嵌套数组转换为mongodb聚合中的对象?
【发布时间】:2022-02-12 17:18:33
【问题描述】:

要求是将所有sales 数组属性转换为具有其第一个元素的数量值的对象。集合名称为branches,示例数据如下。

[
{
    "_id": 111,
    "recs": [
        {
            "date": "01-01-2021",
            "sales": [
                {
                    "quantity": {
                        "P": 14,
                        "K": 0,
                        "U": 0
                    }
                }
            ]
        },
        {
            "date": "02-01-2021",
            "sales": [
                {
                    "quantity": {
                        "P": 23,
                        "K": 0,
                        "U": 0
                    }
                }
            ]
        }
    ]
},
{
    "_id": 21,
    "recs": [
        {
            "date": "01-01-2021",
            "sales": [
                {
                    "quantity": {
                        "P": 11,
                        "K": 0,
                        "U": 0
                    }
                }
            ]
        },
        {
            "date": "02-01-2021",
            "sales": [
                {
                    "quantity": {
                        "P": 31,
                        "K": 0,
                        "U": 0
                    }
                }
            ]
        }
    ]
}]

预期的响应如下。

[
{
    "_id": 111,
    "recs": [
        {
            "date": "01-01-2021",
            "sale": {
                "P": 14,
                "K": 0,
                "U": 0
            }
        }
    ]
}]

我尝试了$map$addFields,但绝对找不到解决方案。

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework mongoose-schema


    【解决方案1】:

    $map,你需要:

    1. $first 查询recs.sales 数组中的第一个sales.quantity 对象。
    2. $mergeObjectrecs 数组中的当前文档与 (1) 中的文档合并。
    db.collection.aggregate([
      {
        "$project": {
          _id: 1,
          recs: {
            "$map": {
              "input": "$recs",
              "in": {
                "$mergeObjects": [
                  "$$this",
                  {
                    sales: {
                      $first: "$$this.sales.quantity"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    Sample Mongo Playground

    【讨论】:

    • 它就像一个魅力。我真的很感激你。最后,我只是问,因为我很好奇,有没有可能用$arrayToObject 做同样的事情?
    • 您好,我认为$arrayToObject 不适合这种情况。
    猜你喜欢
    • 2020-04-23
    • 2023-01-12
    • 1970-01-01
    • 2021-01-18
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多