Mongodb – повторяющиеся поля в $set и $setOnInsert

В это сообщение, принятый ответ объясняет, что у вас не может быть одинаковых полей в $set и $setOnInsert в операции upsert.

Может кто-нибудь объяснить, почему это так? Похоже, что $setOnInsert не должно конфликтовать с $set, поскольку первое используется при вставке документа, а второе — при обновлении документа.


person jtmarmon    schedule 18.12.2014    source источник
comment
Честно говоря, у меня нет объяснения, почему это так сейчас; Я бы тоже хотел, чтобы это было реализовано. Существует запрос на улучшение SERVER-10711, позволяющий $set и $setOnInsert работать в то же обновление на том же поле. Вы можете комментировать, смотреть и голосовать за эту проблему, чтобы повысить ее приоритет.   -  person wdberkeley    schedule 18.12.2014
comment
спасибо, что указали на это @wdberkeley. Вы знаете, есть ли обходной путь для этого без необходимости двух запросов?   -  person jtmarmon    schedule 18.12.2014


Ответы (2)


Оператор $set также используется в upsert. Поэтому бессмысленно ссылаться на одни и те же поля как в $set, так и в $setOnInsert.

Просто попробуйте это на пустой коллекции:

db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});
person hemme    schedule 21.11.2015
comment
Это не ерунда. Например, мне нужно, чтобы поле было true, если документ был только что вставлен, и false, если он только что был обновлен. Если одно и то же поле существует как в $set (как false), так и в $setOnInsert (как true), и документ вставлен, поле в $setOnInsert должно иметь приоритет, даже если оно существует и в разделе $set. - person maganap; 25.04.2017

Я столкнулся с этой проблемой. Если кто-то ищет решение, вам нужно понять, как работает механизм $set и $setOnInsert. $set обновляет, если найден (игнорируя $setOnInsert). $setOnInsert вставляет новую запись (а затем выполняет $set) Я этого не знал и думал, что будет работать только один оператор. Таким образом я смог избавиться от повторяющихся полей

person Александр Артюх    schedule 28.11.2020