MongoDB Change Streams事件:替换还是更新?

时间:2019-03-25 07:44:02

标签: mongodb changestream

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

我不确定何时确切地发生“替换”和“更新”事件。

例如,当我使用MongoDB Compass更改文档的1个字段时,我希望事件“更新”将触发,但是当我记录该事件时,它是“替换”。

因此,如果预期的更新实际上是“替换”事件,那么真正的“更新”事件何时触发?

谢谢。

1 个答案:

答案 0 :(得分:0)

简而言之,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操作进行查询,计算起来会很昂贵。