Как найти значение и проект с условием в MongoDB? - PullRequest
0 голосов
/ 06 сентября 2018

Это запрос, который был написан для проекта 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 голосов
/ 06 сентября 2018

Предложил бы пару изменений в ваш конвейер. Замените ваш последний $project конвейер на оператор $addFields, и так как поле userExamDetails является массивом, используйте $setIsSubset оператор в качестве вашего условного оператора для фильтра массива.

Последний этап конвейера должен быть следующим:

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