MongoDB更新管道中使用$cond切换嵌套数组likedBy值的问题
问题原因
你当前的更新语句不符合预期有两个核心问题:
- 聚合更新阶段中
$comments指代的是整个评论数组,不是你匹配到的单条评论对象,直接操作$comments.likedBy会破坏原有数组结构 - 普通位置运算符
$无法直接在聚合更新的字段路径中生效,不能通过位置运算符直接定位到匹配的评论修改子字段
正确更新语句
db.collection.update({ id: 1, "comments.id": 1 }, [ { $set: { comments: { $map: { input: "$comments", as: "comment", in: { $cond: [ // 只处理id为1的目标评论 {$eq: ["$$comment.id", 1]}, { // 保留评论其他字段,仅修改likedBy $mergeObjects: [ "$$comment", { likedBy: { $cond: [ {$in: ["Potato", "$$comment.likedBy"]}, // 已存在则移除该用户 {$setDifference: ["$$comment.likedBy", ["Potato"]]}, // 不存在则添加该用户 {$concatArrays: ["$$comment.likedBy", ["Potato"]]} ] } } ] }, // 非目标评论直接原样返回 "$$comment" ] } } } } } ])
逻辑说明
- 通过
$map遍历整个comments数组,逐行判断是否是目标评论 - 仅对id匹配的评论执行点赞切换逻辑,其余评论完全保留原有内容
- 用
$mergeObjects避免评论的text等其他字段在更新中丢失
内容的提问来源于stack exchange,提问作者Chique
相关产品推荐
相关产品推荐

