如何排除在其他集合中有引用的文档?

时间:2021-06-26 15:20:51

标签: mongodb mongoose aggregation-framework

我有一个名为“users”的集合,如下所示

[{
    "_id" : ObjectId("60360581ce8d63116c5ce6fb"),
    "userType" : [
        "STUDENT"
    ],
    "firstName" : "Shourv ",
    "lastName" : "Das",
},

{
    "_id" : ObjectId("6027fdb087d0b94d18611db4"),
    "userType" : [
        "STUDENT"
    ],
    "isVerified" : false,
    "firstName" : "Umor",
    "lastName" : "Ahmed"
},
{
    "_id" : ObjectId("6027fd9587d0b94d18611db3"),
    "userType" : [
        "STUDENT"
    ],
    "isVerified" : false,
    "firstName" : "Razel",
    "lastName" : "Khan",
},
...
]

在这些用户中,有些被添加到名为“sectionStudents”的集合中,如下所示。

[{
    "_id" : ObjectId("60d736baee3b6b154ccdcc33"),
    "course" : ObjectId("5ffeec372b2234556439d1da"),
    "section" : ObjectId("6002fae3e58bc750b4394229"),
    "student" : ObjectId("60360581ce8d63116c5ce6fb"),
},

/* 2 createdAt:6/26/2021, 2:36:20 AM*/
{
    "_id" : ObjectId("60d63e44691df002f0e662ed"),
    "course" : ObjectId("5ffeec372b2234556439d1da"),
    "section" : ObjectId("6002fae3e58bc750b4394229"),
    "student" : ObjectId("6027fdb087d0b94d18611db4"),
    
},
{
    "_id" : ObjectId("60d63a9fddcd320314a16470"),
    "course" : ObjectId("5ffeec372b2234556439d1da"),
    "section" : ObjectId("6002fae3e58bc750b4394229"),
    "student" : ObjectId("6027fd9587d0b94d18611db3"),
},
...
]

“sectionsStudents”集合中“用户”的引用是student

我现在的要求是,我想从“users”集合中获取未添加到“sectionStudents”集合中的“course”中的所有文档。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

  • $lookup 使用管道,将 _id 传递给管道,将条件与学生字段匹配并使用 $limit 返回单个文档,因为我们只需要条件文档
  • $match student 应该为空
  • $unset student 我们不需要的字段
db.users.aggregate([
  {
    $lookup: {
      from: "sectionStudents",
      let: { student: "$_id" },
      pipeline: [
        { 
          $match: { 
            $expr: { $eq: ["$$student", "$student"] },
            course: ObjectId("5ffeec372b2234556439d1da")
          } 
        },
        { $limit: 1 }
      ],
      as: "student"
    }
  },
  { $match: { student: [] } },
  { $unset: "student" }
])

Playground

相关问题