首页 > 解决方案 > 如何在 MongoDB 聚合中添加来自不同集合的多个 $match 条件

问题描述

我有 2 个不同的 MongoDB 集合 -包含两个共同的部门的员工部门。我想加入这两个集合并从两个集合中添加多个 $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
         }
     }
])

上面的查询不起作用,还有其他方法吗?

标签: mongodbjoinaggregation-frameworkmatch

解决方案


您的查询有几个问题 - 您不能在阶段deptNM: "HR"之前过滤字段,因为字段不是来自员工集合,请尝试以下查询:$lookupdeptNM

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-游乐场


推荐阅读