mongoose 如何计算活动设置?

xpszyzbs  于 2023-02-04  发布在  Go
关注(0)|答案(1)|浏览(98)

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

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

computer

_id: ObjectId('6098c5ab615d9e23543d0f6f')
name: 'TestComputer'
category: 'A'
tags: [
    'TestTag'
]

setting

_id: ObjectId('61e56339b528bf009feca149')
name: 'FirstSetting'
category: 'A'
priority: 1
tags: [
    ObjectId('61b873ec6d075801f7a97e18')
]

_id: ObjectId('61e56339b528bf009feca150')
name: 'SecondSetting'
category: 'A'
priority: 2
tags: [
    ObjectId('61b873ec6d075801f7a97e18')
]

其思想是,您可以创建一个标记,并标记您的计算机设置,但只能在同一类别中:

  • 示例:类别"A"的标记只能存在于类别"A"的计算机和设置中 *

一台计算机一次只能有一个活动设置。活动设置是共享同一标记的设置。如果设备与多个设置共享标记,则优先级最高的设置优先。
因此,基于这些规则,我想为我的每个设备添加一个新的***activeSetting***属性,如下所示:
computer

_id: ObjectId('6098c5ab615d9e23543d0f6f')
name: 'TestComputer'
category: 'A'
tags: [
    'TestTag'
]
activeSetting: ObjectId('61e56339b528bf009feca149')
    • 我所尝试的**

我试过使用lookup来获取计算机列表和每个标记的设置列表,但我真的不知道从那里去哪里。

pxiryf3j

pxiryf3j1#

一种选择是:

db.computer.aggregate([
  {$match: {_id: ObjectId("6098c5ab615d9e23543d0f6f")}},
  {$lookup: {
      from: "settings",
      localField: "category",
      foreignField: "category",
      pipeline: [
        {$sort: {priority: 1}},
        {$limit: 1},
        {$project: {_id: 1}}
      ],
      as: "activeSetting"
  }},
  {$set: {activeSetting: {$first: "$activeSetting._id"}}}
])

了解它在playground example上的工作原理

相关问题