'MongoDB - query references 2 deep of ObjectIDs

I've inherited a Azure Cosmos database with a MongoDB API. There is extensive use of "discriminators" so a single collection has many different models.

I am trying to query a document three levels deep based on document ids (ObjectId())

Parent Group

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

Sub Group

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

Member

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

Examples I've seen deal with nested documents NOT references

Is it possible to query the Member documents and return?

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

After reading the comments and further reading i've got this. Its almost there but I think the limitation of MongoDB will prevent the solution being in a single query. The goal is to return ParentGroups->Subgroups->Members Where Members have an "induction" value of "whatever". I am either returning ALL ParentGroups or nothing at all

 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"
             }
     }
 
 ])


Solution 1:[1]

Solution that worked for me:

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,
        },
      },
    },
  },
]);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user3067684