【问题标题】:What's the difference between replaceOne() and updateOne() in MongoDB?MongoDB 中的 replaceOne() 和 updateOne() 有什么区别?
【发布时间】:2016-06-21 07:05:17
【问题描述】:

MongoDB 批量操作有两种选择:

  1. Bulk.find.updateOne()

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

  2. Bulk.find.replaceOne()

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

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

【问题讨论】:

    标签: mongodb mongodb-query crud


    【解决方案1】:

    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

    【讨论】:

    • “更改架构”是什么意思?
    • replace 使用相同的参数将文档替换为新文档。通过更新,您可以添加/删除构成文档的参数。
    • 啊好的,所以替换总是更改_id
    • 您好,我刚用当前版本的c#驱动2.4.4试了一下。 @caub:替换不会改变_id。 @Hughzi:我能够用更多和更少的字段替换文档。那么“更改架构”是什么意思?
    • @BooFar 哦,对不起,是的,我完全错了,.replace(One) 用提供的新文档覆盖整个文档,但保留 _id。因此它可能会更改该文档中的字段数。通常您可以使用 .updateOne 和 $set 来保留现有值
    【解决方案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
    }
    

    【讨论】:

      【解决方案3】:

      db.collection.replaceOne() 的作用与db.collection.updateOne() 完全相同。

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

      【讨论】:

        猜你喜欢
        • 2016-08-11
        • 1970-01-01
        • 2022-12-09
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2014-06-03
        相关资源
        最近更新 更多