Монго добавить или обновить объект в массиве - PullRequest
0 голосов
/ 11 мая 2018

У меня есть документ:

{ _id: ObjectId("5af06ec792e0fd001f86661d"), 
 'company': 'ABC', 
 'profile_set' :
   [
     { 'name' : 'nick', 'options' : 0 },
     { 'name' : 'joe',  'options' : 2 },
     { 'name' : 'burt', 'options' : 1 }
   ] 
}

, и я хотел бы добавить новый документ в набор profile_set, если имя еще не существует ИЛИ, если оно существует, обновите существующий.

Так что в этом примере, если я попытался добавить:

{'name' : 'matt', 'options' : 0}

, он должен добавить его, но добавив

{'name' : 'nick', 'options' : 8}

следует обновить его с именем nick , поскольку этот объект уже существует с именем nick, и он обновит значение других полей до нового.

db.coll.update(
    {_id: id, 'profile_set.name': {$ne: 'nick'}}, 
    {$push: {profile_set: {'name': 'nick', 'options': 8}}})

эта команда добавит ее, только если она не существует.Как я могу изменить его так, чтобы, если он существует, обновить его новыми значениями?

update:

Я хочу найти и обновить, как указано выше, любой документ, имеющий 'company': 'ABC'.

1 Ответ

0 голосов
/ 11 мая 2018

То, что вы хотите, это bulkWrite(), где вы выполняете обе операции для $push там, где его нет, и $set для элемента «совпавшего» массивав том же запросе к серверу:

db.coll.bulkWrite([
  { "updateMany": {
    "filter": { company: "ABC", "profile_set.name": "nick" },
    "update": {
      "$set": { "profile_set.$.options": 8 }
    }
  }},
  { "updateMany": {
    "filter": { "company": "ABC", "profile_set.name": { "$ne": "nick"} },
    "update": {
       "$push": { 
         "profile_set": { "name": "nick", "options": 8 }
       }
    }
  }}
])

И в bulkWrite() вариантная операция - "updateMany", которая фактически совпадает с опцией "multi": true или методом updateMany(), за исключением того, что мы выдаем в "партии".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...