2013-04-25 3 views
120

В чем разница между сохранением и вставкой в ​​Mongo DB? как выглядит тот жеВ чем разница между сохранением и вставкой в ​​Mongo DB?

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

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

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

+0

fyi save() теперь устарел в pymongo. –

ответ

121

Сохранить Vs Вставка:

В ваших данных примерах, поведение, по существу, то же самое.

save ведет себя по-другому, если он передается с параметром «_id».

Для сохранения, если документ содержит _id, он будет запрашивать сбор в поле _id, если нет, он будет вставляться.

Если документ не существует с указанным значением _id, метод save() выполняет вставку с указанными полями в документе.

Если документ существует с указанным значением _id, метод save() выполняет обновление, заменяя все поле в существующей записи полями из документа.


Сохранить против обновления:

update изменяет существующий документ согласованный с Params запроса. Если такого совпадающего документа нет, наступает upsert.

  • upsert : false: Ничего не происходит, когда такой документ не существует
  • upsert : true: Новый документ будет создаваться с содержанием, равным Параметры запроса и обновления PARAMS

save: Не допускать query- Титулы. если _id существует, и есть соответствующий документ с тем же _id, он заменяет его. Если _id не указан/нет соответствующего документа, он вставляет документ как новый.

+14

Как насчет сохранения vs update с upsert: true? – Jeff

+8

обе есть другой синтаксис. Обновление принимает несколько аргументов ({condition}, {update to doc}, upsert, multi), тогда как save принимает только один аргумент (_id является параметром для условного аргумента) .update может принимать любое условие, но сохранение имеет ограничение условия только на _id. – Rahul

+1

Начиная с версии 2.6, сохранение имеет второй аргумент, в котором содержится документ, в котором выражается озабоченность по поводу записи. http://docs.mongodb.org/manual/reference/method/db.collection.save/ – huggie

30

save вставки или обновления документа.

insert делает только вставка.

Но в вашем случае он будет делать то же самое, что и документ, сохраненный в сохранении, не имеет поля _id.

1

С точки зрения ORACLE: Монго Вставка => Oracle вставить Монго сохранить => Oracle слияния

10

Если вы пытаетесь использовать «вставить» с идентификатором, который ранее был использован в той же коллекции, вы получите повторяющаяся ошибка ключа. Если вы используете «сохранить» с идентификатором, который уже находится в одной коллекции, он будет обновлен/перезаписан.

Если вы хотите сделать истинное обновление, я бы предложил использовать «обновление». Обновление не будет перезаписываться способом Сохранить, если вы сохраняете, используя тот же идентификатор, который уже находится в коллекции.

Например, у вас есть два поля «x» и «y», и вы хотите сохранить оба значения, но изменить значение «x». Если вы выбрали команду «сохранить» и не указали y с предыдущим значением или вообще не указали y в своем сохранении, тогда y больше не будет иметь то же значение или быть там. Однако, если вы решили обновить с помощью $ set и только включили x в ваш оператор обновления, вы не повлияли бы на y.

3

Рассмотрим следующий документ

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

если БД уже содержит документ с _id: 1, а затем

операция сохранения будет бросать исключение, как показано ниже

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

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

+0

'db.collection.save()' метод обновляет документ, если документ с тем же _id уже существует в базе данных. Когда документ с тем же _id уже существует в базе данных, метод сохранения полностью заменяет документ новым документом . Из книги - Pro MongoDB Development –

10

Давая пример

Сохранить яблоко

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, был вставлен как нет яблока с Ид же объекта, чтобы сделать обновление

Вставьте оранжевая

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

Так сохранить будет выступать в качестве обновления, если поставляются с ИД объекта, при условии, что идентификатор объекта уже существует другой мудрым он делает вставку.

49

Рассмотрим два случая здесь для сохранения: -

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:  
+7

Диаграммы следующего уровня –

+2

Упрощенное время, чтобы аккуратно рисовать и представлять диаграммы. – fanbondi

0

db.<collection_name>.save(<Document>) равнозначно запросу InsertOrUpdate.

В то время как db.<collection_name>.insert(<Document>) эквивалентно просто вводу запроса.

Смежные вопросы