Как обновить поле, которое может появиться в разных местах документа? - PullRequest
0 голосов
/ 06 октября 2019

У меня следующая структура документа:

{
  "_id": ObjectId("12345678"),
  "name": "object name",
  "descriptions": "object description",
  "questions": {
    "mandatory": [
      {
        "name": "question name",
        "mandatory": true,
        "items": [
          {
            "id": 1,
            "name": "option1 value"
          }
        ]
      }
    ],
    "optional": [
      {
        "name": "question name",
        "mandatory": false,
        "items": [
          {
            "id": 4,
            "name": "option4 value"
          }
        ]
      }
    ]
  }
}

В моей коллекции я хочу обновить все документы, в которых есть элемент с определенным идентификатором. Проблема в том, что item, который я хочу обновить, может отображаться либо под mandatory, либо под optional. Прямо сейчас я использую отдельный запрос для обновления элементов в необязательном порядке:

itemCollection.update(
    {
    'questions.optional':{$exists:true}
    },
    {
        $set:{"questions.optional.$[].items.$[itemField].name":item.name}
    },
    {
        arrayFilters:
        [
            {"itemField.id": itemId}
        ],
        $multi:true
    }, (error) => {
        if(!error){
           // do something if no error
        }
    }
)

Затем я использую тот же запрос (с необходимыми изменениями) для обновления элементов в обязательном порядке. Есть ли способ, которым я могу объединить эти два запроса в один, так что если в документе есть элемент с желаемым идентификатором, он будет обновляться независимо от того, является ли он обязательным или необязательным?

1 Ответ

2 голосов
/ 07 октября 2019

Поскольку элемент будет присутствовать только в одном массиве, следующий запрос может помочь:

db.collection.update({},
    {
        $set:{
            "questions.mandatory.$[].items.$[filter].name": "Updated Name",
            "questions.optional.$[].items.$[filter].name": "Updated Name"
        }
    },
    {
        "arrayFilters":[
            {
                "filter.id":4
            }
        ]
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...