MongoDB 3.4版本下更新数组中指定评论字段失败的解决方案咨询
解决方案:MongoDB 3.4更新数组中特定元素的方法
你遇到的问题根源很明确:MongoDB 3.4并不支持arrayFilters特性,这个功能是从3.6版本才开始引入的,所以你的原查询会报错。下面给你两种适用于3.4版本的可行方案,都能实现你想要的更新特定评论的需求:
方案一:结合位置操作符$和精确查询条件
由于你的comment数组中每个元素的_id是唯一的,我们可以把数组元素的匹配条件直接放到查询筛选器里,再用位置操作符$定位到要更新的元素:
db.story.update( { _id: mongoose.Types.ObjectId(storyId), "comment._id": mongoose.Types.ObjectId(commentId), "comment.author": mongoose.Types.ObjectId(authorId) }, { $set: { "comment.$.text": "Update text with this", "comment.$.edited": true } } )
原理说明:
- 查询条件中同时指定了文档的
_id,以及comment数组中元素的_id和author,确保只找到包含目标评论的文档。 - 位置操作符
$会自动指向查询条件中匹配到的第一个数组元素(因为你的评论_id唯一,所以就是你要更新的那一个),然后通过$set修改它的text和edited字段。
方案二:使用$elemMatch匹配数组元素
如果想更清晰地表达数组元素的多条件匹配,也可以用$elemMatch操作符:
db.story.update( { _id: mongoose.Types.ObjectId(storyId), comment: { $elemMatch: { _id: mongoose.Types.ObjectId(commentId), author: mongoose.Types.ObjectId(authorId) } } }, { $set: { "comment.$.text": "Update text with this", "comment.$.edited": true } } )
原理说明:
$elemMatch用于指定数组中至少有一个元素满足所有给定的条件(这里就是评论的_id和author都匹配)。- 同样,位置操作符
$会指向这个匹配到的元素,完成字段更新。
额外提醒
- 因为你的评论
_id是唯一标识,所以这两种方法都能精准定位到目标元素,不会出现误更新其他评论的情况。 - 如果后续业务允许,建议升级到MongoDB 3.6及以上版本,
arrayFilters会让数组元素的更新操作更灵活,尤其是需要批量更新多个数组元素时,体验会更好。
内容的提问来源于stack exchange,提问作者Ayush Bahuguna
相关产品推荐
相关产品推荐

