在mongodb中将$ inc与$ addToSet一起使用

时间:2018-08-02 18:59:03

标签: javascript node.js mongodb mongoose

我有一个简单的功能可以在此Web应用程序的后端上赞帖子。

我正在使用.findByIdAndUpdate进行两项更改:

  • 将user_id推送到帖子的_liked_by数组中。

  • 更改likes_count属性以反映更新。

我正在使用$addToSet修饰符将user_id推送到帖子的_liked_by数组中,以避免将user_id推送两次。

但是,如果我只是增加likes_count,则即使user_id数组中已经存在_liked_by并且该数组保持相同大小,该函数实际上也会对其进行递增。

是否可以通过一种优雅的方式传递_liked_by数组大小作为likes_count属性的值?

以下是代码:

Post.findByIdAndUpdate({
    _id: post_id
  }, {
    $addToSet: {
      _liked_by: user_id
    },
    // I'd like to have something like...
    $set: {
      likes_count: _liked_by.length
      // ...as If it reads the actual length after the previous $addToSet
      //  Is there an option to do something similar?
    }
  }, {
    new: true
  })
  .then((updated_post) => {
    res.status(200).json({
      message: "Post has been liked Successflly!",
      post: updated_post
    });
  })
  .catch((err) => {
    res.status(500).json({
      message: "something went wrong | internal server error ",
      err
    });
  });
};

1 个答案:

答案 0 :(得分:1)

在查询的过滤器(查询)部分过滤您的 _liked_by 数组,而不用$addToSet进行过滤,然后您可以在此处使用$inc来增加<由1组成的strong> _liked_by 数组

Post.findByIdAndUpdate(
  { "_id": post_id, "_liked_by": { "$ne": user_id } },
  {
    "$addToSet": { "_liked_by": user_id },
    "$inc": { "likes_count": 1 }
  },
  { "new": true }
)

您也可以使用$push,因为我们正在查询部分进行过滤

Post.findByIdAndUpdate(
  { "_id": post_id, "_liked_by": { "$ne": user_id } },
  {
    "$push": { "_liked_by": user_id },
    "$inc": { "likes_count": 1 }
  },
  { "new": true }
)