如何在MongoDB中向指定记录的upvoters数组追加元素且不覆盖原有内容
问题原因
你当前的写法是直接给upvoters字段赋值新数组,MongoDB会直接用新值覆盖原有字段内容,自然会清空之前的数组数据。另外你原有代码里写的["req.params.userid"]是把字符串"req.params.userid"存入数组,没有取到实际的用户ID变量值。
解决方案
用MongoDB提供的数组更新操作符实现追加效果:
- 基础追加用
$push操作符,会直接在数组末尾添加元素 - 点赞场景推荐用
$addToSet操作符,只有用户ID不在数组中时才会添加,天然避免重复点赞的问题
修改后代码
基础追加版本
router.post('/upvoted/:articleid/:userid', (req, res) => { Article.findOneAndUpdate( { articleid: req.params.articleid }, { $push: { upvoters: req.params.userid } }, (failure, success) => { if (success) { res.status(200).send("done") } else { res.status(200).send("not done") } } ) })
优化版本(推荐)
额外增加去重逻辑,同时同步更新点赞数,符合实际业务需求:
router.post('/upvoted/:articleid/:userid', (req, res) => { Article.findOneAndUpdate( { articleid: req.params.articleid }, { $addToSet: { upvoters: req.params.userid }, $inc: { upvotes: 1 } }, { new: true }, // 可选配置,返回更新后的最新文档数据 (err, result) => { if (result) { res.status(200).send("done") } else { res.status(500).send("not done") } } ) })
内容的提问来源于stack exchange,提问作者Tanzeel
相关产品推荐
相关产品推荐

