javascript 如何将数据从一个结构迁移到另一个结构?

7eumitmz  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(139)

我有一个包含3个集合的MongoDB。下面是这3个集合,每个集合包含一个文档示例:
tag

_id: ObjectId('61b873ec6d075801f7a97e18')
name: 'TestTag'
category: 'A'

computer

_id: ObjectId('6098c5ab615d9e23543d0f6f')
name: 'TestComputer'
category: 'A',
tags: [
    ObjectId('61b873ec6d075801f7a97e18')
]

setting

_id: ObjectId('61e56339b528bf009feca149')
name: 'TestSetting'
category: 'A',
tags: [
    ObjectId('61b873ec6d075801f7a97e18')
]

正如你所看到的,所有3个文档都有一个category属性,最后2个文档有一个tags属性。这个想法是,你可以创建一个标签,并标记您的计算机和设置与标签,但只能在同一类别。
现在,我尝试从tags转到groups,因此,我创建了一个新的组集合,如下所示,而不是标记计算机和设置:
groups

_id: ObjectId('63d2929c2c71e51f8ffcc921')
name: 'TestGroup'
category: 'A'
computers: []
settings: []

我希望从***标记***“迁移”到***组***。因此,对于标记集合中的每个标记,我希望创建一个名称和类别相同的组。对于使用该标记标记的每个计算机和设置,我希望将它们的_id添加到组中的计算机和设置数组。
因此,如果我们使用我所展示的文档,它将创建以下组:

_id: ObjectId('63d26d582c71e51f8ffcc8aa')
name: 'TestTag'
category: 'A'
computers: [
    ObjectId('6098c5ab615d9e23543d0f6f')
]
settings: [
    ObjectId('61e56339b528bf009feca149')
]

我如何进行这样的查询?

aelbi1ox

aelbi1ox1#

首先执行$group,按类别和名称对所有tags进行分组。然后,执行$lookupcomputersetting,以查找匹配的记录。最后,对$lookup结果和$merge/$outgroups集合进行处理。

db.tag.aggregate([
  {
    $group: {
      _id: {
        name: "$name",
        category: "$category"
      },
      tags: {
        "$addToSet": "$_id"
      }
    }
  },
  {
    "$lookup": {
      "from": "computer",
      "localField": "tags",
      "foreignField": "tags",
      "let": {
        c: "$_id.category"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $eq: [
                "$$c",
                "$category"
              ]
            }
          }
        },
        {
          $project: {
            "_id": 1
          }
        }
      ],
      "as": "computers"
    }
  },
  {
    "$lookup": {
      "from": "setting",
      "localField": "tags",
      "foreignField": "tags",
      "let": {
        c: "$_id.category"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $eq: [
                "$$c",
                "$category"
              ]
            }
          }
        },
        {
          $project: {
            "_id": 1
          }
        }
      ],
      "as": "settings"
    }
  },
  {
    $project: {
      _id: 0,
      name: "$_id.name",
      category: "$_id.category",
      computers: {
        "$map": {
          "input": "$computers",
          "as": "c",
          "in": "$$c._id"
        }
      },
      settings: {
        "$map": {
          "input": "$settings",
          "as": "s",
          "in": "$$s._id"
        }
      }
    }
  },
  {
    "$merge": {
      "into": "groups",
      "on": "_id",
      "whenMatched": "merge"
    }
  }
])

Mongo Playground

相关问题