这是写到项目examDetails的查询,条件是userExamDetails中的任何值都不应在examDetails中显示。 $ eq条件在这里不起作用。
db.getCollection('collectionOne').aggregate([
{'$match': { "user_id": ObjectId("5a1fb48c9815361dbe631974"), 'status': 1 }},
{ '$lookup': {
from: 'collectionTwo',
localField: 'package.ids',
foreignField:'_id',
as:'packageDetails'
}},
{ '$lookup': {
from: 'collectionThree',
localField: 'packageDetails.ids',
foreignField:'examId',
as:'userExamDetails'
}},
{ '$lookup': {
from: 'collectionFour',
localField: 'packageDetails.exams',
foreignField:'_id',
as:'examDetails'
}},
{ '$project': {
'packageDetails': '$packageDetails',
'userExamDetails': '$userExamDetails',
'examDetails': {
'$filter': {
input: "$examDetails",
as: "examDetails",
cond: {
'$eq': [ "$$examDetails._id",
"$userExamDetails.examId"]
}
}
}
}
}
])
答案 0 :(得分:0)
建议对管道进行一些更改。用 $project
运算符替换最后一个$addFields
管道,由于userExamDetails
字段是一个数组,请使用 $setIsSubset
运算符作为数组过滤器的条件运算符。
最后一个管道阶段应如下:
{ '$addFiels': {
'examDetails': {
'$filter': {
'input': '$examDetails',
'as': 'exam',
'cond': {
'$setIsSubset': [
['$$exam._id'],
'$userExamDetails.examId'
]
}
}
}
} }