Я не думаю, что mongodb поддерживает этот тип выборочного апсертирования. У меня та же проблема, что и у LeMiz, и использование update (критерии, newObj, upsert, multi) не работает правильно, когда речь идет как о «созданной», так и «обновленной» временной метке. Учитывая следующее утверждение upsert:
update( { "name": "abc" },
{ $set: { "created": "2010-07-14 11:11:11",
"updated": "2010-07-14 11:11:11" }},
true, true )
Сценарий № 1 - документ с «именем» из «abc» не существует:
Новый документ создается с именем «=» abc, «создан» = 2010-07-14 11:11:11 и «обновлен» = 2010-07-14 11: 11: 11.
Сценарий № 2 - документ с «именем» из «abc» уже существует со следующим:
'name' = 'abc', 'creation' = 2010-07-12 09:09:09 и 'updated' = 2010-07-13 10:10:10.
После отката документ теперь будет таким же, как результат в сценарии № 1. В upsert нет способа указать, какие поля будут установлены при вставке, а какие поля останутся одними при обновлении.
Мое решение состояло в том, чтобы создать уникальный индекс для полей critera , выполнить вставку и сразу же после этого выполнить обновление только в поле «обновлено».