Mongodb mongoose中带条件的查找

Mongodb mongoose中带条件的查找,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有两个收藏。文章和书签 文章 { _id:“5FAA889AD5E0A6326A873D3”, 名称:“第1条” }, { _id:“5FAA889AD5E0A6326A873D”, 名称:“第2条” } 书签 { _id:“5FAA889AD5E0A6326A873D1”, 用户id:“5fc7b50da483a66a86aa7e9e”, 型号识别号:“5FAA889DE5E0A6326A873D3” } 我想加入带有书签的文章。如果用户将文章添加到书签中。 我试过的 const agg

我有两个收藏。文章和书签

文章
{
_id:“5FAA889AD5E0A6326A873D3”,
名称:“第1条”
},
{
_id:“5FAA889AD5E0A6326A873D”,
名称:“第2条”
}
书签
{
_id:“5FAA889AD5E0A6326A873D1”,
用户id:“5fc7b50da483a66a86aa7e9e”,
型号识别号:“5FAA889DE5E0A6326A873D3”
}
我想加入带有书签的文章。如果用户将文章添加到书签中。 我试过的

const aggregate=wait Articles.aggregate([{
$lookup:{
来自:“类别”,
localField:“类别\u id”,
foreignField:“\u id”,
as:“类别识别码”
}
},
{
$lookup:{
来自:“书签”,
localField:“\u id”,
foreignField:“型号识别号”,
as:“书签”
}
}
]);
但它将为文章提供所有书签,而不仅仅是登录用户书签。那么我如何添加一个条件呢

{“user\u id”:objectId(req.user.\u id)}//记录的用户id
您可以从MongoDB v3.6开始使用

  • 要将localField
    \u id
    作为
    model\u id
    变量传递,可以使用$$reference在查找管道中使用该字段
  • 管道放置
    $match
    阶段并匹配您所需的条件和
    用户id
    条件

MongoDB v3.4的其他选项

  • 迭代
    书签的循环
    ,并根据条件得到过滤后的书签

您可以在
$lookup
中嵌套管道

db.articles.aggregate([
  {
    $lookup: {
      from: "bookmarks",
      let: {
        article_id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$model_id",
                    "$$article_id"
                  ]
                },
                {
                  $eq: [
                    "$user_id",
                    "5fc7b50da483a66a86aa7e9a"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "bookmarks"
    }
  }
])

这里有一个正在工作的

我收到错误MongoError:$lookup的参数必须是字符串,让:{model_id:$_id“}是objecttype你能确认你的mongodb版本吗?可能是3.6以下的mongodb版本,如果v3.6ok支持此功能,则可以使用此功能。是3.4。有没有其他选择我想没有你可以做过滤后,你的正常查找阶段,更新我的答案与该选项。让我们。
  {
    $lookup: {
      from: "bookmarks",
      localField: "_id",
      foreignField: "model_id",
      as: "bookmarks"
    }
  },
  {
    $addFields: {
      bookmarks: {
        $filter: {
          input: "$bookmarks",
          cond: { $eq: ["$$this.user_id", objectId(req.user._id)] }
        }
      }
    }
  }
db.articles.aggregate([
  {
    $lookup: {
      from: "bookmarks",
      let: {
        article_id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$model_id",
                    "$$article_id"
                  ]
                },
                {
                  $eq: [
                    "$user_id",
                    "5fc7b50da483a66a86aa7e9a"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "bookmarks"
    }
  }
])