mongoDB найти и обновить или вставить - PullRequest
0 голосов
/ 26 августа 2018

Я использую mongoDB и mongoose.

У меня есть следующая схема:

{ "group" : 
    "items" : [ 
                {
                    "name": "aaa",
                    "value": "aaa_value",
                    "description": "some_text"
                },
                {
                    "name": "bbb",
                    "value": "bbb_value"
                    "description": "some_text2"
                }, 
                {
                    "name": "ccc",
                    "value": "ccc_value"
                    "description": "some_text3"
                },  
        ]
}    

Моя функция получает имя и значение. Если представлен элемент с таким именем, я хочу обновить значение в соответствии с параметром значения (и не изменять описание). Если нет, я хочу добавить новый элемент в массив с именем и значением параметра и описанием по умолчанию.

Как это можно сделать? Спасибо

1 Ответ

0 голосов
/ 26 августа 2018

Операция upsert невозможна для встроенного массива.Это должен быть двухэтапный процесс.

Вы сначала (пытаетесь) удалить запись, а затем нажать ее.Или сначала обновите запись, а если это не удалось, вставьте ее.

Первый подход: (сначала удалите его)

db.collection.update(
  { _id : ObjectId("xyz")},
  { $pull: {"items.name": "aaa"}}
)

, затем вставьте его:

db.collection.update(
  { _id : ObjectId("xyz")},
  { $push: {"items": {
         name : "ddd",
         value: "new value",
         description: "new description"
  }}
)

Второй подход: (сначала обновите его)

var result = db.collection.update(
{
   _id : ObjectId("xyz"),
   "items.name": "aaa")
},
{
   $set: {"items.$.name": {name: "new name"}}
}
);

А потом, если ничего не обновляется, то вставьте его.

if(!result.nMatched)
{
db.collection.update(
    {
        _id: ObjectId("xyz"),
        "items.name": {$ne: ObjectId("xyz"}}
    },
    {
        $push: {
            items: {
                name: "new name",
                value: "new value",
                description: "new description"
            }
        }
    }
);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...