我有一个简单的功能可以在此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
});
});
};
答案 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 }
)