在猫鼬中进行条件查找

2024-02-21

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

articles

{
    _id: "5faa889ade5e0a6326a873d3",
    name: "article 1"
},
{
    _id: "5faa889ade5e0a6326a873d",
    name: "article 2"
}

书签

{
    _id: "5faa889ade5e0a6326a873d1",
    user_id: "5fc7b50da483a66a86aa7e9e",
    model_id: "5faa889ade5e0a6326a873d3"
}

我想用书签加入文章。如果用户为一篇文章添加了书签。 我尝试过什么

const aggregate = await Articles.aggregate([{
        $lookup: {
            from: "categories",  
            localField: "category_id",
            foreignField: "_id",
            as: "category_id"
        }
    },
    {

        $lookup: {
            from: "bookmarks",  
            localField: "_id",
            foreignField: "model_id",
            as: "bookmarks"
        }
    }
]);

但它会提供文章的所有书签,而不仅仅是登录的用户书签。那么我该如何添加条件。

{ "user_id": objectId(req.user._id) } // logged user id

您可以使用带管道的 $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries 从 MongoDB v3.6 开始,

  • 让传递 localField_id as model_id变量,您可以使用 $$ 引用来使用查找管道内的字段,
  • 管道放置$match阶段并匹配您所需的条件和user_id状况
  {
    $lookup: {
      from: "bookmarks",
      let: { model_id: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$model_id", "$model_id"] },
            user_id: objectId(req.user._id)
          }
        }
      ],
      as: "bookmarks"
    }
  }

其他选项MongoDB v3.4,

  • $filter https://docs.mongodb.com/manual/reference/operator/aggregation/filter/index.html迭代循环bookmarks并根据条件获取过滤的书签
  {
    $lookup: {
      from: "bookmarks",
      localField: "_id",
      foreignField: "model_id",
      as: "bookmarks"
    }
  },
  {
    $addFields: {
      bookmarks: {
        $filter: {
          input: "$bookmarks",
          cond: { $eq: ["$$this.user_id", objectId(req.user._id)] }
        }
      }
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在猫鼬中进行条件查找 的相关文章

随机推荐