Есть ли опция upsert в команде вставки mongodb?

Я знаю, что это может быть глупый вопрос, но я прочитал в электронной книге, что в вставке MongoDB есть опция upsert. Я не мог найти надлежащую документацию по этому поводу. Может ли кто-нибудь просветить меня об этом?


person astroanu    schedule 14.11.2013    source источник
comment
Google mongodb upsert, удар 3-го результата :) docs.mongodb.org/ руководство/ссылка/метод/db.collection.update   -  person Rituparna Kashyap    schedule 14.11.2013


Ответы (2)


Поскольку upsert определяется как операция, которая "создает новый документ, когда ни один документ не соответствует критериям запроса", для команды upsertsin insert места нет. Это опция для команды update. Если вы выполняете команду, как показано ниже, она работает как update, если есть документ, соответствующий query, или как insert с документом, описанным update в качестве аргумента.

db.collection.update(query, update, {upsert: true})

MongoDB 3.2 добавляет replaceOne:

db.collection.replaceOne(query, replacement, {upsert: true})

который ведет себя аналогично, но его replacement не может содержать операторов обновления.

person zero323    schedule 14.11.2013
comment
Помимо обновления, db.collection.save() также предоставляет возможность обновления. - person glormph; 14.11.2013
comment
Он переводится как this.update( { _id : obj._id } , obj , true ), если typeof( obj._id ) != "undefined", но это не более чем обертка. - person zero323; 14.11.2013
comment
@zero323 true вместо True :) - person Abdul Hameed; 28.05.2016
comment
@АбдулХамид Правда. Судя по внешнему виду, я почти уверен, что это было скопировано из сеанса Python :) Исправлено, спасибо. - person zero323; 28.05.2016
comment
Разве это не обновит существующий документ (если он существует) новым документом? - person basickarl; 30.10.2016
comment
Что вы имеете в виду, что его замена не может содержать операторов обновления... замена - это значение документа, как она может когда-либо содержать операторы? - person Noldorin; 21.09.2017
comment
В Python это True, но в оболочке Mongo это true. В Mongo нет bool как True. - person WesternGun; 17.01.2018
comment
Вместо этого я рекомендую findOneAndReplace(), так как он возвращает _id - person Gunar Gessner; 15.09.2020

Как и в ссылках, предоставленных PKD, db.collection.insert() не предоставляет возможности upsert. Вместо этого mongo insert вставляет новый документ в коллекцию. Upsert возможен только с использованием db.collection.update() и db.collection.save().

Если вы передадите в db.collection.insert() документ, который уже находится в коллекции и, таким образом, имеет _id, аналогичный существующему _id, будет выдано исключение с повторяющимся ключом.

person glormph    schedule 14.11.2013
comment
Спасибо. Как поясняет документ, upsert поддерживается только для обновления и сохранения. - person astroanu; 14.11.2013