【问题标题】:MongoDB $lookup replace array of _id with array of objects without converting arrays to object and removing fieldsMongoDB $lookup 用对象数组替换 _id 数组,而不将数组转换为对象并删除字段
【发布时间】:2020-07-05 19:40:18
【问题描述】:

我有一个这样的对象:

{
"_id": {
    "$oid": "5f0047f02fd3fc048aab9ee9"
},
"array": [
    {
        "_id": {
            "$oid": "5f00dcc23e12b8721e4f3672"
        },
        "name": "NAME",
        "sub_array": [
            {
                "sub_array2": [
                    {
                        "$oid": "5f00e367f7b8747beddc6d31"
                    },
                    {
                        "$oid": "5f00f26c1facd18c5158d1d3"
                    }
                ],
                "_id": {
                    "$oid": "5f00de99a8802e767885e72b"
                },
                "week_day": 1
            },
            {
                "sub_array2": [
                    {
                        "$oid": "5f00e367f7b8747beddc6d31"
                    }
                ],
                "_id": {
                    "$oid": "5f00f2501facd18c5158d1d2"
                },
                "week_day": 3
            }
        ]
    },
    {
        "_id": {
            "$oid": "5f00f2401facd18c5158d1d1"
        },
        "name": "NAME1",
        "sub_array": []
    }
]
}

我想用另一个集合中的对象替换 sub_array id,但这会导致将 arraysub_array 转换为对象并丢失所有数据,例如 week_day。 查找:

 '$lookup': {
  'from': 'sati', 
  'localField': 'array.sub_array.sub_array2', 
  'foreignField': '_id', 
  'as': 'array.sub_array.sub_array2'
}

结果:

{
"_id": {
    "$oid": "5f0047f02fd3fc048aab9ee9"
},
"array": {
    "sub_array": {
        "sub_array2": [
            {
                "_id": {
                    "$oid": "5f00e367f7b8747beddc6d31"
                },
                "endTime": "2020-07-03T12:06:50+0000",
                "startTime": "2020-07-03T12:05:50+0000",
                "data1": {
                    "$oid": "5f005e63ab1cbf2374d5163f"
                }
            },
            {
                "_id": {
                    "$oid": "5f00e367f7b8747beddc6d31"
                },
                "endTime": "2020-07-03T12:06:50+0000",
                "startTime": "2020-07-03T12:05:50+0000",
                "data1": {
                    "$oid": "5f005e63ab1cbf2374d5163f"
                }
            },
            {
                "_id": {
                    "$oid": "5f00e367f7b8747beddc6d31"
                },
                "endTime": "2020-07-03T12:06:50+0000",
                "startTime": "2020-07-03T12:05:50+0000",
                "data1": {
                    "$oid": "5f005e63ab1cbf2374d5163f"
                }
            }
        ]
    }
}
}

有没有办法在不将整个数组转换为对象并删除其他字段的情况下“替换”单个 ID。我知道猫鼬可以做到这一点,但我不允许使用它。其他问题都没有帮助 (example)。

【问题讨论】:

    标签: arrays mongodb aggregation-framework


    【解决方案1】:

    它将用$lookup 结果覆盖整个对象key:value。相反,将查找结果存储在 sati 变量中并添加一个额外的阶段,如下所示。

    $map 允许使用迭代数组并转换每个项目。

    db.collection.aggregate([
      {
        "$lookup": {
          "from": "sati",
          "localField": "array.sub_array.sub_array2",
          "foreignField": "_id",
          "as": "sati"
        }
      },
      {
        $project: {
          array: {
            $map: {
              input: "$array",
              as: "array",
              in: {
                _id: "$$array._id",
                name: "$$array.name",
                sub_array: {
                  $map: {
                    input: "$$array.sub_array",
                    as: "sub_array",
                    in: {
                      _id: "$$sub_array._id",
                      week_day: "$$sub_array.week_day",
                      sub_array2: {
                        $filter: {
                          input: "$sati",
                          as: "sati_item",
                          cond: {
                            $in: [
                              "$$sati_item._id",
                              "$$sub_array.sub_array2"
                            ]
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    ])
    

    MongoPlayground | Altenative with $mergeObjects

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 2020-11-12
      • 2021-09-17
      • 1970-01-01
      • 2021-05-03
      • 2018-12-04
      • 2021-06-16
      相关资源
      最近更新 更多