В чем разница между save и insert в Mongo DB?
в чем разница между save и insert в Mongo DB? оба выглядят одинаково
db.users.save({username:"google",password:"google123"})
db.users.insert({username:"google",password:"google123"})
9 ответов
Сохранить Vs Вставить:
в ваших приведенных примерах поведение по существу одно и то же.
save
ведет себя по-другому, если он передается с параметром "_id".
для сохранения, если документ содержит _id
, он будет upsert запрос коллекции на _id
поле, если нет, то вставить.
если документ не существует с указанным значением _id, метод save() выполняет вставку с указанными полями в документе.
если документ существует с указанным значением _id, метод save () выполняет обновление, заменяя все поля в существующей записи полями из документа.
сохранить vs обновить :
update
изменяет существующий документ, соответствующий параметрам запроса. Если такого совпадающего документа нет, тогда upsert
поставляется в изображение.
-
upsert : false
: ничего не происходит, когда нет такого документа -
upsert : true
: новый документ создается с содержимым, равным параметрам запроса и параметрам обновления
save
: не разрешает никаких запросов-параметров. если _id
существует, и есть соответствующий документ с тем же _id
, Он заменяет его. Когда no _id не указан / нет соответствующего документа, он вставляет документ как новый.
давайте рассмотрим два случая здесь для сохранения : -
1) наличие _id в doc.
2) не имея _id в doc.
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 doc в коллекции.
2) не имея _id 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
не только вставка.
но в вашем случае он будет делать то же самое, что и документ, указанный в save, не имеет
на примере
сохранить Яблоко
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 вставлен, поскольку нет apple с тем же идентификатором объекта, чтобы сделать update
вставить оранжевый
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"
}
so save будет действовать как обновление, если поставляется с идентификатором объекта, при условии, что идентификатор объекта уже существует другим образом, он делает вставку.
Если вы попытаетесь использовать "insert" с идентификатором, который ранее использовался в той же коллекции, вы получите дубликат ключа. Если вы используете "сохранить" с идентификатором, который уже находится в той же коллекции, он будет обновляться/перезаписи.
Если вы хотите сделать истинное обновление, я бы предложил использовать "обновление". Обновление не будет перезаписано способом сохранения, если вы сохраняете тот же идентификатор, который уже есть в коллекции.
например, у вас есть два поля " x" и "y", и вы хотите сохранить оба, но изменить значение"x". Если вы выбрали команду "Сохранить" и не включили y с предыдущим значением или вообще не имели y в своем сохранении, то y больше не будет иметь того же значения или быть там. Однако если вы решили обновить с помощью $set и только x включен в инструкцию update, вы не повлияете на y.
Как вы можете видеть здесь, метод save по существу будет делать upsert (обновление, если он найдет doc, вставьте иначе):
http://docs.mongodb.org/manual/reference/method/db.collection.save/#db.collection.save
Insert - это просто прямая вставка.
рассмотрим следующий документ
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
Если БД уже содержит документ с _id: 1, то
операция сохранения вызовет исключение, как показано ниже
E11000 duplicate key error index ...........
и где как операция вставки, просто переопределит документ.
db.<collection_name>.save(<Document>)
эквивалентно запросу InsertOrUpdate.
а, db.<collection_name>.insert(<Document>)
эквивалентно просто вставить запрос.