В чем разница между 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 ...........

и где как операция вставки, просто переопределит документ.


с точки зрения ORACLE: монго вставить => вставить в Oracle mongo save => Oracle merge


db.<collection_name>.save(<Document>) эквивалентно запросу InsertOrUpdate.

а, db.<collection_name>.insert(<Document>) эквивалентно просто вставить запрос.