我有一个包含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')
]
我如何进行这样的查询?
1条答案
按热度按时间aelbi1ox1#
首先执行
$group
,按类别和名称对所有tags
进行分组。然后,执行$lookup
到computer
和setting
,以查找匹配的记录。最后,对$lookup
结果和$merge
/$out
到groups
集合进行处理。Mongo Playground