MongoDB 聚合双重查找和管道

时间:2021-01-18 13:53:39

标签: mongodb mongoose

当我使用 $lookup 时,第二个 pipeline 有问题,但使用 localFieldforeignField 时效果很好。

我的收藏如下:

FeedCategories: 
{"_id":{"$oid":"1"},"name":"XXX1","status":"active"}
{"_id":{"$oid":"2"},"name":"XXX2","status":"active"}

Feeds:
{ "_id": { "$oid": "1" }, "category": { "$oid": "1" }, "status": "published" }
{ "_id": { "$oid": "2" }, "category": { "$oid": "1" }, "status": "published" }
{ "_id": { "$oid": "3" }, "category": { "$oid": "2" }, "status": "published" }

FeedCategoriesUser
{ "_id": { "$oid": "1" }, "Feed_left_id": { "$oid": "1" }, "User_right_id": { "$oid": "2" }}
{ "_id": { "$oid": "2" }, "Feed_left_id": { "$oid": "2" }, "User_right_id": { "$oid": "2" }}

我的猫鼬代码:

    FeedCategoriesModel.aggregate([{
        $lookup: {
          from: 'feeds',
          let: { categoryId: "$_id" },
          pipeline: [
            { "$match": {
                "$expr": { "$eq": [ "$category", "$$categoryId" ] },
                "status": "published"
              }}
          ],
          as: 'feedsByCategory'
        }
      }, {
        $lookup: {
          from: 'feed_categories_user',
          localField: 'feedsByCategory._id',
          foreignField: 'Feed_left_id',
          as: 'feedsByCategoryCompleted'
        }
      }]);

但是当我以这种方式使用管道时,我在 feedsByCategoryCompleted 中没有任何结果:

FeedCategoriesModel.aggregate([{
    $lookup: {
      from: 'feeds',
      let: { categoryId: "$_id" },
      pipeline: [
        { "$match": {
            "$expr": { "$eq": [ "$category", "$$categoryId" ] },
            "status": "published"
          }}
      ],
      as: 'feedsByCategory'
    }
  }, {
    $lookup: {
      from: 'feed_categories_user',
      let: {feedid: "$feedsByCategory._id"},
      pipeline:[{
        "$match":{
          "$expr": { "$eq": [ "$Feed_left_id", "$$feedid" ] }
        }
      }],
      as: 'feedsByCategoryUsed'
    }
  }])

如何在上面的例子中使用 piepeline 进行第二次 $lookup?

1 个答案:

答案 0 :(得分:1)

在第二次查找中,您需要在 $in 内使用 $eq 插入 $match。原因是,feedsByCategory 是第一次查找的数组,您将其 _id 分配给 feedid。所以它也是一个数组。当您检查数组内匹配项内的可能值时,您需要使用 $in

{
    $lookup: {
      from: "FeedCategoriesUser",
      let: {
        feedid: "$feedsByCategory._id"
      },
      pipeline: [
        {
          "$match": {
            "$expr": {
              "$in": [
                "$Feed_left_id",
                "$$feedid"
              ]
            }
          }
        }
      ],
      as: "feedsByCategoryUsed"
    }
  }

工作Mongo playground