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

Mik*_* B. 41 crud mongodb mongodb-query

MongoDB批量操作有两个选项:

  1. Bulk.find.updateOne()

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

  2. Bulk.find.replaceOne()

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

根据文档,这两种方法都可以替换匹配的文档.我是否理解正确,这updateOne()是更通用的方法,可以完全替换文档replaceOne(),还是只更新其特定字段?

Hug*_*hzi 50

随着replaceOne()你只能更换整个文档,同时updateOne()允许更新领域.

由于replaceOne()替换了整个文档 - 旧文档中未包含在新文档中的字段将丢失.随着updateOne()可在不老的文档中丢失的领域增加新的领域.

例如,如果您有以下文档:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333
}
Run Code Online (Sandbox Code Playgroud)

使用:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})
Run Code Online (Sandbox Code Playgroud)

结果是:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}
Run Code Online (Sandbox Code Playgroud)

使用:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})
Run Code Online (Sandbox Code Playgroud)

结果是:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
Run Code Online (Sandbox Code Playgroud)

请注意,updateOne()您可以在文档上使用更新运算符.

  • "改变架构"是什么意思? (3认同)
  • 啊好的,所以替换总是改变`_id` (3认同)
  • replace使用相同的参数替换新文档.使用更新,您可以添加/删除组成文档的参数. (2认同)
  • @BooFar 哦,抱歉,是的,我完全错了,.replace(One) 用提供的新文档覆盖了整个文档,但保留了 _id。因此它可能会更改该文档中的字段数。通常你可以使用 .updateOne 和 $set 来保留现有值 (2认同)

Jur*_*dom 14

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

由于replaceOne()替换了整个文档 - 旧文档中未包含在新文档中的字段将丢失。随着updateOne()可在不老的文档中丢失的领域增加新的领域。

例如,如果您有以下文档:

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

   "my_test_key3" : 3333
}
Run Code Online (Sandbox Code Playgroud)

使用:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})
Run Code Online (Sandbox Code Playgroud)

结果是:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}
Run Code Online (Sandbox Code Playgroud)

使用:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})
Run Code Online (Sandbox Code Playgroud)

结果是:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
Run Code Online (Sandbox Code Playgroud)