我有一个名为“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”中的所有文档。
我怎样才能做到这一点?
答案 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" }
])