Mongodb 具有嵌入式透视列表的多对多

Mongodb 具有嵌入式透视列表的多对多,mongodb,Mongodb,我正在尝试选择引用组的所有用户,该组引用的权限“valid”设置为true(可能是多个)。为了实现这一点,我计划使用带有查找的聚合 db={ “用户”:[ { “_id”:“1”, “团体”:[ "2" ] }, { “_id”:“2”, “团体”:[ "1" ] } ], “集团”:[ { “_id”:“1”, “权限”:[ "12", "3" ] }, { “_id”:“2”, “权限”:[ "3", "2" ] } ], “许可”:[ { “_id”:“12”, “有效”:真 }, { “

我正在尝试选择引用组的所有用户,该组引用的权限“valid”设置为true(可能是多个)。为了实现这一点,我计划使用带有查找的聚合

db={
“用户”:[
{
“_id”:“1”,
“团体”:[
"2"
]
},
{
“_id”:“2”,
“团体”:[
"1"
]
}
],
“集团”:[
{
“_id”:“1”,
“权限”:[
"12",
"3"
]
},
{
“_id”:“2”,
“权限”:[
"3",
"2"
]
}
],
“许可”:[
{
“_id”:“12”,
“有效”:真
},
{
“_id”:“3”,
“有效”:真
},
{
“_id”:“2”,
“有效”:真
}
]
}
我想不出一个有效/简单的方法来做这件事

我有两个想法:

  • 使用执行从组到权限的查找的管道从用户到组进行查找。问题是,我需要进行$match,以查看用户的组列表是否包含组id(我不知道是否可能)
  • 执行从用户到组的简单查找,而不是展开联接字段,并使用联接字段从组到权限进行第二次查找。然后在最后做一个$match,看看是否有任何包含“valid”true的结果,并将结果分组以获得原始用户。但是这个想法听起来不是很有效。()
  • 对此有什么想法或意见吗?

    • 您可以在查找中使用对象的直接数组而不使用
      $unwind
      作为本地字段
    • 第二次查找将用
      权限
      响应替换
      字段,因为下一阶段不需要它

    db.users.aggregate([
      {
        $lookup: {
          from: "group",
          localField: "groups",
          foreignField: "_id",
          as: "group"
        }
      },
      {
        $lookup: {
          from: "permission",
          localField: "group.permissions",
          foreignField: "_id",
          as: "group"
        }
      },
      { $match: { "group.valid": true } },
      { $unset: "group" }
    ])