Запрос агрегации MongoDB, возвращает коллекции, которые являются ссылками на модель, на основе параметра - PullRequest
1 голос
/ 08 марта 2020

У меня следующий запрос,

MyModel.aggregate([
    {
      $project: {
        field: 1,
      }
    },
    {
      $lookup: {
        from: "AnotherModel",
        localField: "_id",
        foreignField: "someField",
        as: "field"
      },
    },
    {
      $unwind: {
        path: "$_id"
      }
    }
])

Эта работа выполняется, но не так, как ожидалось. В AnotherModel есть поле с именем show, и я хочу, чтобы этот запрос возвращал MyModel коллекций, только если show имеет значение true для AnotherModel. Я пытался,

MyModel.aggregate([
    {
      $project: {
        field: 1,
      }
    },
    {
      $lookup: {
        from: "AnotherModel",
        localField: "_id",
        foreignField: "someField",
        as: "field"
      },
      $where: {
        show: true // <-- this part
      }
    },
    {
      $unwind: {
        path: "$_id"
      }
    }
])

Но это бросило ошибку. Как мне этого добиться?

1 Ответ

2 голосов
/ 08 марта 2020

Попробуйте это: Некоррелированные подзапросы

MyModel.aggregate([
  {
    $project: {
      field: 1
    }
  },
  {
    $lookup: {
      from: "AnotherModel",
      let: {
        id: "$_id"
      },
      pipeline: [
        {
          $match: {
            show: true,
            $expr: {
              $eq: [
                "$someField",
                "$$id"
              ]
            }
          }
        }
      ],
      as: "field"
    }
  },
  {
    $unwind: {
      path: "$_id"
    }
  }
])

MongoPlayground

...