在 MongoDB 中,replaceOne()和 updateOne()有什么区别?

MongoDB 批量操作有两种选择:

  1. Bulk.find.updateOne()

    将单个文档更新操作添加到批量操作列表。该操作可以替换现有文档或更新现有文档中的特定字段。

  2. Bulk.find.replaceOne()

    将单个文档替换操作添加到批量操作列表中。使用 Bulk.find()方法指定确定要替换哪个文档的条件。Bulk.find.replaceOne()方法将替换限制为单个文档。

根据文档,这两种方法都可以替换匹配的文档。我是否正确地理解了,updateOne()是更通用的方法,它可以像 replaceOne()一样替换文档,或者只是更新其特定的字段?

63354 次浏览

使用 replaceOne(),您只能替换整个文档,而 updateOne()允许更新字段。

由于 replaceOne()替换了旧文档中不包含在新文档中的整个文档字段,因此将丢失。使用 updateOne()可以添加新字段,而不会丢失旧文档中的字段。

例如,如果你有以下文件:

{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key3" : 3333
}

使用:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

结果:

{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key4" : 4.0
}

使用:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

结果:

{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key3" : 3333.0,
"my_test_key4" : 4.0
}

注意,使用 updateOne()可以在文档上使用 更新操作员

replaceOne()代替整个文档,而 updateOne()允许更新或添加字段。当使用 updateOne()时,您还可以访问 更新操作员,它可以可靠地对文档执行更新。例如,两个客户端可以“同时”递增同一文档中同一字段上的一个值,并且两个递增都将被捕获,而使用替换时,一个客户端可能会覆盖另一个客户端,而另一个客户端可能会丢失其中一个递增。

由于 replaceOne()替换了旧文档中不包含在新文档中的整个文档字段,因此将丢失。使用 updateOne()可以添加新字段,而不会丢失旧文档中的字段。

例如,如果你有以下文件:

{
"_id" : ObjectId("0123456789abcdef01234567"),


"my_test_key3" : 3333
}

使用:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

结果:

{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key4" : 4.0
}

使用:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

结果:

{
"_id" : ObjectId("0123456789abcdef01234567"),
"my_test_key3" : 3333.0,
"my_test_key4" : 4.0
}

db.collection.replaceOne()db.collection.updateOne()做完全相同的事情。

主要的区别在于,正在编辑的 db.collection.replaceOne()数据必须来回传送到服务器,而 db.collection.UpdateOne()只请求经过过滤的数据,而不是整个文档!