首页 > 解决方案 > 如果存在与 MongoDB 和 Mongoose 匹配的另一个文档,则添加字段

问题描述

我的数据库中有一组包含基本信息的帖子,例如:

Posts = {
   _id: '',
   title '',
   desc '',
...
}

我也有一个喜欢的集合,比如(创建或删除用户喜欢的文件):

Likes = {
_id: '',
user_id: '',
post_id: '',
}

目标是,当我获得Posts列表时,添加一个字段Liked ,如果文档Like匹配,则显示 true/false ,以及Like集合中的匹配数(我知道如何)喜欢:

Posts = [{
   _id: '',
   title '',
   desc '',
   liked: true,
   likes: 5,
...
}, ...]

我用过$lookup&$addFields但到目前为止只能加入一个值。在我的情况下,我想要一个特定的文档并按 2 个字段(user_id、post_id)过滤。

到目前为止我得到了什么:

    const posts = await posts.aggregate
    ([
      {
        $lookup: {
          from: 'likes',
          localField: '_id',
          foreignField: 'post_id',
          as: 'likes'
        }
      },
      { $match: {
        user_id: mongoose.Types.ObjectId(req.params.id),
      } },
      {
        $addFields: {
          likes: 
            { $size: "$likes" } // here nb of likes
        }
      }
    ])

标签: javascriptmongodbmongoose

解决方案


试试这个

db.getCollection('post').aggregate([
  {
    $lookup: {
      from: 'likes',
      localField: '_id',
      foreignField: 'post_id',
      as: 'likes'
    }
  },
  {
      $addFields:{
          size:{$size:"$likes"},
          liked: 
          {$size: {
                        $filter: {
                            input: "$likes",
                            as: "item",
                            cond: { $eq: [ "$$item.user_id", ObjectId("5f2a38ad61a591cf96d58f6a") ] }
                        }
                }
             }
          }
  },
  {
  $addFields:{
      liked:{
          $cond:[{$eq:["$liked",0]},false,true]
          }
      }    
  }
])

推荐阅读