MongoDB 更改流事件:替换还是更新?

MongoDB Change Streams events: replace vs update?

我查看了文档https://docs.mongodb.com/manual/reference/change-events/

我不确定事件 "replace" 和 "update" 发生的确切时间。

例如,当我使用 MongoDB Compass 更改文档的 1 个字段时,我预计事件 "update" 会触发,但当我记录该事件时,它是 "replace" .

那么,如果预期的更新实际上是一个 "replace" 事件,那么真正的 "update" 事件何时会触发?

谢谢。

简而言之,update 事件是您更新文档而不替换它。 replace 事件是您创建新文档替换旧文档。

简单示例:

replset:PRIMARY> db.test.find()
{
  "_id": 0,
  "txt": "qwerty"
}

做一个 update:

replset:PRIMARY> db.test.update({_id:0}, {$set:{txt:'abc'}})

此更改流事件的结果:

{ _id:
   ....
  operationType: 'update',
   ....

正在做 save:

replset:PRIMARY> db.test.save({_id:0, txt:'qwerty'})

此更改流事件的结果:

{ _id:
   ....
  operationType: 'replace',
   ....

如果在 Compass 中更新文档导致 replace 事件,这意味着 Compass 正在后台执行 save 操作而不是 update。从 GUI 的角度来看,这是有意义的,因为 save 更改的文档比检查旧文档和新文档之间的差异并制作特殊的文档更容易 update使用特定的 $set 操作进行查询,计算成本很高。