Запрос конвейера поиска агрегации MongoDB

Мне нужна помощь с запросом агрегирования поиска MongoDB.

Пытаюсь объединить две коллекции, а именно кафе и штамп. Во время поиска я хотел бы сопоставить марки для данного кафе, а затем дополнительно отсортировать и ограничить результаты до 10.

Соответствующие поля идентификатора: _id для коллекции кафе и cafeId in для коллекции штампов.

Вот что я придумал, однако, похоже, возникает проблема при попытке сопоставления по идентификаторам между данными коллекциями. Я считаю, что это может быть связано с тем, что Mongo не рассматривает их как ObjectID, но я не уверен.

db.cafe.aggregate([
      {
        $lookup: {
          from: "stamp",
          as: "stamps",
          let: {
            id: "$_id",
            name: "$name"
          },
          pipeline: [
            { $project: { id:1, cafeId: { $toObjectId: "$$id"}, name:1 } },
            { $match: { expr: { $eq: ["$$cafeId", "$cafeId"] } } },
            { $sort: { stampDate: -1 } },
            { $limit: 10 }
          ]
        }
      }
    ]);

person Eladian    schedule 29.09.2020    source источник


Ответы (1)


Удалось понять, как добиться того, чего я хотел. Оставьте это здесь для всех, кто пытается достичь тех же результатов.

db.cafe.aggregate([
  {
    $lookup: {
      from: "stamp",
      as: "stamps",
      let: {
        id: "$_id",
        name: "$name" //All cafes variables,
      },
      pipeline: [
        {
          $project: {
            cafeId: 1,
            stampDate: 1,
            stampId: 1,
            cafeId: 1,
            status: 1,
            userId: { $toObjectId: "$userId" }
          }
        },
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [{ $toObjectId: "$$id" }, { $toObjectId: "$cafeId" }]
                },
                {
                  $eq: [
                    { $toObjectId: "$userId" },
                    mongoose.Types.ObjectId(req.user._id)
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  }
]);
person Eladian    schedule 29.09.2020