Как добавить несколько условий $ match из разных коллекций в агрегаты MongoDB - PullRequest
1 голос
/ 03 марта 2020

У меня есть 2 разные коллекции MongoDB - Сотрудники и Отделы , содержащие вместе deptid . Я хочу присоединиться к этим 2 коллекциям и добавить несколько условий $ match из обеих коллекций.

Сотрудники:

{
    Empid: 001
    Name: "John"
    Age: 41
    Location: "Belfast"
    deptid: "D101"
}

Отдел:

{
    deptID: "D101"
    deptNM: "HR"
    deptPr: "O"
}

Запрос :

db.getCollection('Employees').aggregate([
    { $match:{
        deptNM: "HR",
        Age : {$gt: 40}
       }
    },
    { $lookup: {
        from: "Dept",
        localField: "deptid",
        foreignField: "deptID",
        as: "HR EMP"
        }
     },
     { $project: {
         Empid: 1, Name: 1, Location: 1, deptNM: 1, deptPr: 1
         }
     }
])

Приведенный выше запрос не работает, есть ли другой способ?

1 Ответ

1 голос
/ 03 марта 2020

В вашем запросе есть несколько проблем - вы не можете фильтровать по полю deptNM: "HR" до этапа $lookup, так как поле deptNM не из Сотрудники коллекция, попробуйте запрос ниже:

db.getCollection('Employees').aggregate([
    /** filter employees to retain whose age > 40 */
    {
        $match: {
            Age: { $gt: 40 }
        }
    },
    /** Get their respective dept */
    {
        $lookup: {
            from: "Dept",
            localField: "deptid",
            foreignField: "deptID",
            as: "HR_EMP"
        }
    },
    /** As lookup's field HR_EMP is an array unwind it to get it into object */
    { $unwind: '$HR_EMP' },
    /** filter depts for HR */
    { $match: { 'HR_EMP.deptNM': "HR" } },
    /** Project only needed fields or transform fields */
    {
        $project: {
            Empid: 1, Name: 1, Location: 1, deptNM: '$HR_EMP.deptNM', deptPr: '$HR_EMP.deptPr'
        }
    }])

Тест: MongoDB-Playground

...