【问题标题】:What is the difference between save and insert in Mongo DB?Mongodb中的保存和插入有什么区别?
【发布时间】:2013-04-19 01:09:41
【问题描述】:

在 Mongo DB 中保存和插入有什么区别? 两者看起来一样

db.users.save({username:"google",password:"google123"})

db.users.insert({username:"google",password:"google123"})

【问题讨论】:

标签: mongodb


【解决方案1】:

save 插入或更新文档。

insert 只进行插入。

但在你的情况下,它会做同样的事情,因为保存中提供的文档没有_id 字段。

【讨论】:

    【解决方案2】:

    正如您在此处看到的,save 方法本质上会执行 upsert(如果找到文档则更新,否则插入):

    http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save

    插入就是这样,直接插入。

    【讨论】:

      【解决方案3】:

      保存与插入:

      在您给出的示例中,行为基本相同。

      save 使用“_id”参数传递时的行为会有所不同。

      为了保存,如果文档包含_id,它将在_id字段上查询集合,如果没有,它将插入。

      如果不存在具有指定 _id 值的文档,则 save() 方法会使用文档中的指定字段执行插入操作。

      如果存在具有指定 _id 值的文档,则 save() 方法执行更新,将现有记录中的所有字段替换为文档中的字段。


      保存与更新

      update 修改与您的查询参数匹配的现有文档。如果没有这样的匹配文件,那就是upsert出现在图片中。

      • upsert : false : 当不存在这样的文档时什么都不会发生
      • upsert : true : 创建新文档,其内容等于查询参数和更新参数

      save :不允许任何查询参数。如果_id 存在并且存在具有相同_id 的匹配文档,它将替换它。当没有指定_id/没有匹配的文档时,将文档作为新文档插入。

      【讨论】:

      • 两者都有不同的语法。 Update 接受多个参数({condition},{update to doc},upsert,multi),而 save 只接受一个参数(_id 是条件参数的参数)。update 可以接受任何条件,但 save 仅在_id 字段。
      • 从 2.6 版开始,save 有第二个参数,用于表示写关注的文档。 docs.mongodb.org/manual/reference/method/db.collection.save
      【解决方案4】:

      在 ORACLE 方面: mongo 插入 => 甲骨文插入 mongo save => Oracle 合并

      【讨论】:

        【解决方案5】:

        如果您尝试将“插入”与以前在同一集合中使用的 ID 一起使用,您将收到重复键错误。如果您对已在同一集合中的 ID 使用“保存”,它将被更新/覆盖。

        如果您希望进行真正的更新,我建议您使用“更新”。如果您使用集合中已有的相同 ID 进行保存,则更新不会像 Save 那样覆盖。

        例如,您有两个字段“x”和“y”,您希望保留这两个字段但更改“x”的值。如果您选择“保存”命令并且没有将 y 包含在之前的值中,或者在您的保存中根本没有 y,那么 y 将不再具有相同的值或存在。但是,如果您选择使用 $set 进行更新并且只在更新语句中包含 x,则不会影响 y。

        【讨论】:

          【解决方案6】:

          考虑下面的文档

          { "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
          

          如果 db 已经包含 _id:1 的文档,则

          保存操作会抛出如下异常

          E11000 duplicate key error index ...........
          

          作为插入操作,将覆盖文档。

          【讨论】:

          • db.collection.save() 方法如果数据库中已经存在具有相同 _id 的文档,则更新文档。当数据库中已经存在具有相同 _id 的文档时,save 方法会用新文档完全替换该文档。来自本书- Pro MongoDB Development
          【解决方案7】:

          举个例子

          拯救苹果

          db.fruit.save({"name":"apple", "color":"red","shape":"round"})
          WriteResult({ "nInserted" : 1 })
          
          db.fruit.find();
          
          {
              "_id" : ObjectId("53fa1809132c1f084b005cd0"),
              "color" : "red",
              "shape" : "round",
              "name" : "apple"
          }
          

          用以前保存的苹果的_id保存一个苹果

          db.fruit.save(
          {"_id" : ObjectId("53fa1809132c1f084b005cd0"),"name":"apple", 
          "color":"real red","shape":"round"})
          
          WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
          

          现在我们保存的苹果有了,颜色从红色更新为真正的红色

          db.fruit.find();
          {
              "_id" : ObjectId("53fa1809132c1f084b005cd0"),
              "color" : "real red",
              "shape" : "round",
              "name" : "apple"
          }
          

          用_id保存一个苹果

          db.fruit.save({"_id" : ObjectId("55551809132c1f084b005cd0"),
          "name":"apple", "color":"real red","shape":"round"})
          
              WriteResult({ "nMatched" : 0, "nUpserted" : 1, 
          "nModified" : 0, "_id": 55551809132c1f084b005cd0 })
          

          Apple 被插入,因为没有具有相同 Object Id 的苹果进行更新

          插入橙色

          db.fruit.insert({"name":"orange", "color":"orange","shape":"round"})
          WriteResult({ "nInserted" : 1 })
          

          插入橙色

          db.fruit.find();
          {
              "_id" : ObjectId("53fa1809132c1f084b005cd0"),
              "color" : "real red",
              "shape" : "round",
              "name" : "apple"
          }
          {
              "_id" : ObjectId("53fa196d132c1f084b005cd7"),
              "color" : "orange",
              "shape" : "round",
              "name" : "orange"
          }
          {
              "_id" : ObjectId("55551809132c1f084b005cd0"),
              "color" : "real red",
              "shape" : "round",
              "name" : "apple"
          }
          

          因此,如果提供了对象 ID,则保存将充当更新,前提是该对象 ID 已经存在,否则它会执行插入。

          【讨论】:

            【解决方案8】:

            让我们考虑这里的两种情况以进行保存:-

            1) 文档中有 _id。

            2) 文档中没有 _id。

                                    Save ()
                                    /     \
                                   /       \
            
                             Having _id     Not Having _id 
            
              ->In this case save will do    ->  It will do normal insertion 
                upsert to insert.Now             in this case as insert() do.
                what that means, it means 
                take the document and replace 
                the complete document having same
                _id.
            

            让我们考虑这里插入的两种情况:-

            1) 集合中有 _id 的文档。

            2) 集合中没有文档的 _id。

                                    Insert()
                                   /        \
                                  /          \
            
               Doc Having _id in collection    Doc Not Having _id 
              ->  E11000 duplicate key     ->Insert a new doc inside the collection.
                  error index:       
            

            【讨论】:

            • 下一级图表
            • 为整齐地绘制和呈现图表所花费的时间投票。
            • 那里有gg图
            【解决方案9】:

            db.<collection_name>.save(<Document>) 相当于 InsertOrUpdate 查询。

            db.<collection_name>.insert(<Document>) 仅相当于插入查询。

            【讨论】:

              猜你喜欢
              • 2020-12-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-21
              • 2012-06-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多