Использовать выходные данные одного этапа конвейера агрегации в условии для следующего этапа - PullRequest
0 голосов
/ 27 сентября 2018

Можно ли использовать поле из этапа агрегации для фильтрации данных на следующем этапе?

У меня есть этот запрос, где я сопоставляю, а затем выполняю поиск.Я использую mongodb 3.4, поэтому я не могу отфильтровать поиск по условию.То, что я хотел бы сделать, - это выполнить сопоставление или проект с фильтром после поиска, чтобы я мог дополнительно отфильтровать документы из коллекции классов.

В этом сценарии коллекция кулаков имеет идентификатор студента, поэтому поиск $ соответствует идентификатору студента в коллекции классов.Проблема в том, что для одного идентификатора студента может быть несколько классов, и $ 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 голосов
/ 27 сентября 2018

Используйте поиск с 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",
  } }
]);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...