在Mongo DB中保存和插入有什么区别?

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

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

保存Vs插入:

在你给出的例子中,行为本质上是一样的。

如果使用“_id”parameter passing,则save行为会有所不同。

对于保存,如果文档包含_id ,则会在_id字段上插入查询集合,否则插入。

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

如果文档以指定的_id值存在,则save()方法将执行更新,将现有logging中的所有字段replace为文档中的字段。


保存与更新

update修改与您的查询参数匹配的现有文档。 如果没有这样的匹配文件,那就是当upsert进来的时候。

  • upsert : false :当没有这样的文件时没有任何反应
  • upsert : true :新文档被创build,其内容等同于查询参数和更新参数

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

让我们考虑这两个案例来保存:

1)在doc中有_id。

2)在doc中没有_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)收集了doc文件。

2)没有收集doc文件。

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

save插入或更新文档。

insert只做一个插入。

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

如果您尝试使用以前在同一个集合中使用的ID进行“插入”,则会出现重复键错误。 如果您使用“保存”的ID已经在同一个集合中,它将被更新/覆盖。

如果你想要做一个真正的更新,我会build议使用“更新”。 如果您使用与集合中相同的ID进行保存,则更新不会以Save方式覆盖。

例如,你有两个字段“x”和“y”,你想保持两个,但改变“x”的值。 如果你select了“保存”命令,并且没有包含前一个值的y,或者在你的保存中没有y,那么y将不再具有相同的值或在那里。 但是,如果您select使用$ set进行更新,并且只有x包含在更新语句中,则不会影响y。

举个例子

保存一个苹果

 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 }) 

苹果被插入,因为没有苹果具有相同的对象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已经存在,否则它会插入。

正如你在这里可以看到的那样,save方法本质上会做一个upsert(如果find了doc,则进行更新,否则插入):

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

插入只是一个直插入。

考虑下面的文件

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

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

保存操作将抛出像下面的exception

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

和插入操作,只会覆盖文件。

就ORACLE而言:mongo insert => Oracle insert mongo save => Oracle合并

db.<collection_name>.save(<Document>)等效于InsertOrUpdate Query。

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