如何在MongoDB中查找具有条件的值和项目?

时间:2018-09-06 08:59:39

标签: mongodb mongodb-query aggregation-framework

这是写到项目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"] } } } } } ])

1 个答案:

答案 0 :(得分:0)

建议对管道进行一些更改。用 $project 运算符替换最后一个$addFields管道,由于userExamDetails字段是一个数组,请使用 $setIsSubset 运算符作为数组过滤器的条件运算符。

最后一个管道阶段应如下:

{ '$addFiels': {
    'examDetails': {
        '$filter': {
            'input': '$examDetails',
            'as': 'exam',
            'cond': {
                '$setIsSubset': [
                    ['$$exam._id'],
                    '$userExamDetails.examId'
                ]
            }
        }
    }  
} }