В чем разница между сохранением и вставкой в БД Mongo?

118

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

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

db.users.insert({username:"google",password:"google123"})
Теги:

9 ответов

115
Лучший ответ

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

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

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

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

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

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


Сохранить и обновить:

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

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

save: не разрешает никаких параметров запроса. если существует _id и существует соответствующий документ с тем же _id, он заменяет его. Если никакой _id не указан/нет соответствующего документа, он вставляет документ как новый.

  • 15
    Как насчет сохранения и обновления с помощью upsert: true?
  • 8
    оба имеют разный синтаксис. Обновление принимает несколько аргументов ({условие}, {обновление до документа}, upsert, multi), тогда как сохранение принимает только один аргумент (_id является параметром для условного аргумента). Update может принимать любое условие, но сохранение имеет ограничение условия только для поле _id.
Показать ещё 1 комментарий
47

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

1) Имея _id в doc.

2) Отсутствие _d в документе.

                        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:       
  • 8
    Диаграммы следующего уровня
  • 2
    Проголосовал за время, затрачиваемое на аккуратную прорисовку и представление диаграмм.
30

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

insert выполняет только вставку.

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

10

Приведя пример

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

Вставить оранжевый

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

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

10

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

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

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

6

Как вы можете видеть здесь, метод сохранения будет по существу выполнять upsert (обновление, если оно находит документ, вставить в противном случае):

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

Вставка - это просто прямая вставка.

3

Рассмотрим приведенный ниже документ

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

Если db уже содержит документ с _id: 1, то

операция сохранения вызовет исключение, как показано ниже

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

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

  • 0
    db.collection.save() обновляет документ, если в базе данных уже существует документ с тем же _id. Когда документ с таким же _id уже существует в базе данных, метод save полностью заменяет документ новым документом. Из книги - Про МонгоДБ Девелопмент
1

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню