MongoDB聚合查找管道查询

时间:2020-09-29 02:40:34

标签: database mongodb mongoose nosql

我正在寻找有关MongoDB查找聚合查询的帮助。

我正试图加入两个集合,即“ cafe”和“ stamp”。在查找期间,我想匹配给定咖啡馆的印章,然后进一步排序并将结果限制为10。

相关的id字段是:“ _ id”代表咖啡馆收藏,“ cafeId”代表邮票收藏。

以下是我提出的内容,但是在尝试按给定集合之间的ID进行匹配时似乎存在问题。我相信这可能与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 }
          ]
        }
      }
    ]);

1 个答案:

答案 0 :(得分:0)

设法弄清楚如何实现我想要的目标。将此保留在此处,以供其他尝试获得相同结果的人使用。

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)
                  ]
                }
              ]
            }
          }
        }
      ]
    }
  }
]);