在猫鼬中,增量的 model.save 是原子的还是我应该始终使用 $inc?

In mongoose, is model.save atomic for increment or should I always use $inc?

我需要在 MongoDB 和 mongoose 中增加记录的 likes 字段,但我对这些操作的原子性知之甚少 'worried',因为这应该是并发安全的:

Post.findById(id, function(err, post) {
  post.update({$inc: {
      likes: 1
  }});
});

Post.findById(id, function(err, post) {
    post.likes++;
    post.save()
});

它们是否提供相同的安全结果?想想我什至必须减少记录的点赞数(例如,如果用户再次点击点赞按钮)

Post.findById(id, function(err, post) {
  post.update({$inc: {
      likes: -1
  }});
});

MongoDB $inc 是单个文档中的原子操作(参见 mongoDB documentation)。

在第二种情况下,操作不是原子的,因为当模型正在保存时,可能会发送另一个请求,加载的 likes 将具有以前的值。