MongoDB $ lookup用对象数组替换_id数组,而无需将数组转换为对象并删除字段 [英] MongoDB $lookup replace array of _id with array of objects without converting arrays to object and removing fields

查看:72
本文介绍了MongoDB $ lookup用对象数组替换_id数组,而无需将数组转换为对象并删除字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的对象:

{
"_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,但这导致将 array sub_array 转换为对象,并丢失所有数据,例如 week_day .查找:

I want to replace sub_array ids with objects from another collection but that results converting array and sub_array to objects and losing all of the data like week_day. Lookup:

 '$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,而无需将整个数组转换为对象并删除其他字段.我知道猫鼬可以做到这一点,但我不允许使用它.其他问题都没有帮助(示例).

Is there a way to "replace" the individual ids without converting entire arrays to objects and removing other fields. I know mongoose can do that but I'm not permitted to use it. None of the other questions helped (example).

推荐答案

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

It will override entire object key:value with $lookup result. Instead, store the lookup result in the sati variable and add an extra stage like shown below.

$ map 允许对数组进行迭代并转换每个项目.

$map allows use iterate over an array and transform each item.

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 |使用$ mergeObjects的替代方法

这篇关于MongoDB $ lookup用对象数组替换_id数组,而无需将数组转换为对象并删除字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆