将一个聚合管道阶段的输出用于下一阶段

时间:2018-09-27 14:03:31

标签: mongodb aggregation-framework

是否可以使用聚合阶段的字段在以后的阶段过滤数据?

我有这个查询,我先进行匹配,然后进行查找。我正在使用mongodb 3.4,因此无法使用条件过滤查找。我想做的是在查找后执行匹配项或带有过滤器的项目,以便我可以进一步从class集合中过滤文档。

在这种情况下,第一个集合具有一个学生ID,因此$ lookup在classes集合中与该学生ID匹配。问题在于,单个studentID可以有多个班级,而$ lookup会拉回所有班级。我想使用比赛中的数据进行进一步的过滤,这样我可以为每个学生撤回一个班级。

    collection.aggregate([
        {$match: {"field1": "value"}},
        {
            $lookup: {
               from: "classes",
               localField: "studentId",
               foreignField: "student._id",
               as: "classes"
            }
        },
        //filter with a match
        {
            $match: {
                "classes.field1": "$field1value", //$field1value is a field from the first collection
            }
        }
        //or filter with project and condition
        { 
            $project: {
                class: {
                    filter: {
                        input: "classes",
                        as: "class",
                        cond: {$eq: ['$$class.field1', "$classes.field1value"]}
                    }
                }
            }
        }
    ])

1 个答案:

答案 0 :(得分:0)

使用pipeline查找。以下查询将起作用:

collection.aggregate([
  { $match: { "field1": "value" } },
  { $lookup: {
    from: "classes",
    let: [studentId: "$studentId", field1value: "$field1value"],
    pipeline: [{ $match: {
      $expr: { 
        $and: [
          { $eq: ["$_id", "$$studentId"] },
          { $eq: ["$field1", "$$field1value"] },
        ]
      },
    } }],
    as: "classes",
  } }
]);

我希望这会有所帮助。