mongodb - создать документ, если он не существует, иначе нажать на массив

У меня есть документ в следующем виде:

{
"_id" : ObjectId("4d2d8deff4e6c1d71fc29a07"),
"user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0",
"events" : [
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 10,
                "data" : "....."
        }
        {
                "profile" : 20,
                "data" : "....."
        }
        ...
   ]
 }

Я хотел бы иметь какое-то утверждение upsert. Необходимо добавить event в массив events для user_id в случае, если такой документ уже существует, в противном случае необходимо создать документ с элементом event.

Это можно сделать?


person LiorH    schedule 23.01.2011    source источник


Ответы (1)


Вы можете выполнять upserts в Mongo, см. раздел Upserts with Modifiers в документе Mongo:

Вы можете использовать upsert с операцией-модификатором. В таком случае модификаторы будут применены к члену критерия обновления, и результирующий объект будет вставлен.

Нужный вам запрос будет выглядеть так:

db.events.update( { "user_id" : "714638ba-2e08-2168-2b99-00002f3d43c0" }, 
{ $push : { "events" : { "profile" : 10, "data" : "X"}}}, {"upsert" : true});
person Javier Ferrero    schedule 23.01.2011
comment
Возможно, я использую другую версию, но только с true в качестве последнего параметра обновления это не работает. Мне пришлось указать {upsert: true} в качестве аргумента. - person Artur Carvalho; 07.07.2015
comment
Пример @Javier Ferrero показывает только $push, а если есть такие поля, как user_type, после того, как user_id также необходимо обновить ..? - person Kanagavelu Sugumar; 01.02.2017
comment
@KanagaveluSugumar, затем объедините: { $set: {...}, $push: {...} } - person Dan Oak; 24.10.2019
comment
Примечание. Используйте $addToSet вместо $push. Вероятно, вам не нужны повторяющиеся элементы. - person Mike; 22.03.2021