MongoDB 更改流事件 : replace vs update?

标签 mongodb changestream

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

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

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

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

谢谢。

最佳答案

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

简单的例子:

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

进行更新:

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

此更改流事件的结果:

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

执行保存:

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

此更改流事件的结果:

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

如果在 Compass 中更新文档导致 replace 事件,这意味着 Compass 正在后台执行 save 操作而不是 update。从 GUI 的角度来看,这是有意义的,因为它更容易保存更改的文档,而不是麻烦检查旧文档和新文档之间的差异并制作一个特殊的 update 查询与特定的 $set 操作,这将是昂贵的计算。

关于MongoDB 更改流事件 : replace vs update?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55333198/

相关文章:

node.js - Meteor - 连接超时。没有收到心跳

node.js - 没有模型或模式的 Mongoose

python - Studio3t 中的查询与 Pymongo 中的查询之间的区别?

node.js - 如果数据库关闭一段时间,MongoDB 会更改流超时

database - 删除文档后如何从MongoDB changeStream获取fullDocument?

node.js - Mongodb更改流运行多次(有点): Node app running multiple instances

javascript - 聚合以按大小创建文档组

javascript - 在 mongodb 的嵌入式文档中返回一个键的最大值

mongodb - 在 mongo shell 中创建 mongo 更改流

MongoDB collection.Watch() 编译并停止运行