MongoDB中的replaceOne()和updateOne()之间的区别是什么?

时间:2016-03-07 16:18:18

标签: mongodb mongodb-query crud

MongoDB批量操作有两个选项:

  1. Bulk.find.updateOne()

      

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

  2. Bulk.find.replaceOne()

      

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

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

3 个答案:

答案 0 :(得分:37)

使用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(),您可以在文档上使用update operators

答案 1 :(得分:2)

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

由于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
}

答案 2 :(得分:0)

db.collection.replaceOne()db.collection.updateOne()完全相同。

主要区别在于,db.collection.replaceOne()所编辑的数据必须往返于服务器,而db.collection.UpdateOne()仅请求过滤后的数据,而不是整个文档! / p>