Mongo DB中保存和插入有什么区别? 两者看起来都一样
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
答案 0 :(得分:134)
保存与插入
在您给出的示例中,行为基本相同。
save
如果使用“_id”参数传递,则行为会有所不同。
对于保存,如果文档包含_id
,它将在_id
字段上查询集合,如果没有,则会插入。
如果文档不存在指定的_id值,则save()方法将使用文档中的指定字段执行插入。
如果存在具有指定_id值的文档,则save()方法将执行更新,将现有记录中的所有字段替换为文档中的字段。
保存与更新:
update
修改与您的查询参数匹配的现有文档。如果没有这样的匹配文档,那就是upsert
出现时的情况。
upsert : false
:没有此类文件时没有任何事情发生upsert : true
:创建新文档,内容等于查询参数和更新参数 save
:不允许任何查询参数。如果_id
存在并且匹配的文档具有相同的_id
,则会替换它。如果没有_id指定/没有匹配的文档,它会将文档作为新文档插入。
答案 1 :(得分:63)
让我们考虑这两个案例进行保存: -
1)在doc。中有_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)收藏中没有doc的_id。
Insert()
/ \
/ \
Doc Having _id in collection Doc Not Having _id
-> E11000 duplicate key ->Insert a new doc inside the collection.
error index:
答案 2 :(得分:35)
save
插入或更新文档。
insert
只会插入。
但在您的情况下,它也会这样做,因为保存中提供的文档没有_id
字段。
答案 3 :(得分:12)
举一个例子
保存Apple
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已插入,因为没有具有相同对象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,则save将充当更新,前提是对象id已经存在,否则它会执行插入操作。
答案 4 :(得分:10)
如果您尝试将“insert”与之前在同一集合中使用的ID一起使用,则会出现重复键错误。如果您使用已存在于同一集合中的ID的“save”,它将被更新/覆盖。
如果您希望进行真正的更新,我建议您使用“更新”。如果您使用集合中已有的相同ID保存,则Update将不会以Save方式覆盖。
例如,您有两个字段“x”和“y”,并且您希望保留两个字段,但更改“x”的值。如果您选择“保存”命令并且未在前一个值中包含y或者在保存中没有y,那么y将不再具有相同的值或者在那里。但是,如果您选择使用$ set进行更新并且只在更新语句中包含x,则不会影响y。
答案 5 :(得分:6)
正如您在此处所看到的,save方法基本上会执行upsert(如果找到doc则更新,否则插入):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
插入只是一个直插件。
答案 6 :(得分:3)
考虑以下文件
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
如果db已包含_id:1的文档,则
保存操作会抛出如下所示的异常
E11000 duplicate key error index ...........
以及插入操作的位置,只会覆盖文档。
答案 7 :(得分:1)
就ORACLE而言: mongo insert => Oracle插入 mongo save => Oracle合并
答案 8 :(得分:1)
db.<collection_name>.save(<Document>)
等同于InsertOrUpdate Query。
虽然db.<collection_name>.insert(<Document>)
仅相当于插入查询。