MongoDB - 查询引用 2 深的 ObjectID

MongoDB - query references 2 deep of ObjectIDs

我继承了一个带有 MongoDB API 的 Azure Cosmos 数据库。 “鉴别器”被广泛使用,因此一个集合有许多不同的模型。

我正在尝试根据文档 ID (ObjectId()) 深入查询文档的三个级别

父组

{
  _id: ObjectId(),
  __type: "ParentGroup",
  name: "group 1",
  subgroups: [
    ...ObjectIds,
  ],
}

子组

{
  _id: ObjectId(),
  __type: "SubGroup",
  name: "a text name",
  members: [
    ...ObjectIds,
  ],
}

会员

{
  _id: ObjectId(),
  __type: "Member",
  name: "string",
  email: "",
  induction: Date,
}

我见过的处理嵌套文档而不是引用的示例

是否可以查询会员文件和return?

[
  {
    parentGroup,
    subgroups: [
      {sub group, members: [...members]},
      {sub group, members: [...members]},
      {sub group, members: [...members]},
    ]
  },
]

阅读评论和进一步阅读后,我明白了。它几乎在那里,但我认为 MongoDB 的限制将阻止解决方案出现在单个查询中。目标是 return ParentGroups->Subgroups->Members 其中成员的“归纳”值是“随便”。我要么 return 所有 ParentGroups 要么什么都没有

 db.development.aggregate([
     { 
         $match: { 
             __type: "ParentGroup",  $expr: {
                $gt: [
                    { $size: "$subgroups" }, 0
                    ] 
                } 
              }
    },
     {
         $lookup: {
             from: "development",
             localField: "subgroups",
             foreignField: "_id",
             as: "subgroups"
             }
     },
     {
        $unwind: {
            path: "$subgroups",
//             preserveNullAndEmptyArrays: true
            } 
        },
         {
         $lookup: {
             from: "development",
             localField: "subgroups.members",
             foreignField: "_id",
             as: "subgroups.members"
             }
     }
 
 ])

对我有用的解决方案:

db.development.aggregate([
  {
    $match: {
      __type: "ParentGroup",
    },
  },
  {
    $lookup: {
      from: "development",
      localField: "subgroups",
      foreignField: "_id",
      as: "subgroups",
    },
  },

  {
    $unwind: {
      path: "$subgroups",
      preserveNullAndEmptyArrays: true,
    },
  },
  {
    $lookup: {
      from: "development",
      localField: "subgroups.members",
      foreignField: "_id",
      as: "subgroups.activities_x",
    },
  },


{
    $unwind: {
      path: "$subgroups.members",
      preserveNullAndEmptyArrays: true,
    },
  },
  
  {
    $match: { "subgroups.members.meta": { $exists: true } },
  },

  {
    $project: {
      _id: 1,
      __type: 1,
      name: 1,
      subgroups: {
        _id: 1,
        __type: 1,
        name: 1,
        members: {
          _id: 1,
          __type: 1,
          name: 1,
          meta: 1,
        },
      },
    },
  },
]);