You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB如何实现条件递增:避免$addToSet未新增时$inc仍执行

MongoDB点赞功能条件更新解决方案

问题根因

普通MongoDB更新操作中,多个更新操作符之间无执行依赖,$addToSet的执行结果不会影响$inc的逻辑,因此原写法无论用户是否已经点赞,都会使likes字段加1。

方法1:调整查询匹配条件(全版本兼容,生产环境推荐)

直接将「用户未点赞」作为更新的前置匹配条件,只有匹配到符合要求的文档时,才会执行后续的更新操作,天然保证$inc和$addToSet同时生效或同时不执行。

db.posts.update(
  // 匹配条件:指定帖子 且 当前用户未在点赞列表中
  {_id: post._id, likedby: {$ne: johnny._id}},
  {
    $inc: {likes: 1},
    $addToSet: {likedby: johnny._id}
  }
)

执行后可通过返回结果的nModified字段判断操作结果:1表示点赞成功,0表示用户已点赞无需重复操作。

方法2:使用聚合更新管道(MongoDB 4.2及以上版本支持)

如果需要在单条更新语句中处理更复杂的联动逻辑,可以使用聚合管道式更新,显式定义条件判断规则:

db.posts.update(
  {_id: post._id},
  [
    {
      $set: {
        likedby: {
          $cond: {
            if: {$in: [johnny._id, "$likedby"]},
            then: "$likedby",
            else: {$concatArrays: ["$likedby", [johnny._id]]}
          }
        },
        likes: {
          $cond: {
            if: {$in: [johnny._id, "$likedby"]},
            then: "$likes",
            else: {$add: ["$likes", 1]}
          }
        }
      }
    }
  ]
)

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:48:01