MongoDB: обновить специфицированные c элементы в массиве - PullRequest
0 голосов
/ 23 января 2020

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

{
    _id: ObjectId(),
    "subjects": [
        {
            "name": "math",
            "first_try": {
                "passed": true
            },
            "second_try": {
                "passed": false
            },
            "third_try": {
                "passed": false
            },
            "fourth_try": {
                "passed": false
            }
        } 
    ]
}

Там есть несколько таких предметов. Пожалуйста, не предлагайте менять структуру данных и т. Д. c. - это поддельная структура данных, созданная только для этого вопроса (не может иметь общие имена, но структура одинакова).

Для каждого из этих предметов у меня всегда есть эти 4 ключа: "first_try", "second_try ", ...," third_try ". Некоторые из них «пройдены», некоторые - нет.

Для каждого предмета я хочу установить first_try.passed: true, если не было других пропущенных попыток. Если, например, third_try.passed:true, я не должен обновлять first_try.

Я пытался выполнить некоторые условия aggregate, включая elemMatch, чтобы найти элементы для обновления, но он выглядит ужасно и не работает, как я ожидал.

Возможно ли обработать этот случай с помощью одного updateMany запроса?

1 Ответ

0 голосов
/ 23 января 2020

Вы можете использовать arrayFilters :

collection.updateMany({}, 
  {$set: {"subjects.$[element].first_try.passed": true}}, 
  {arrayFilters: [{
      "element.first_try.passed":false,
      "element.second_try.passed":false,
      "element.third_try.passed":false,
      "element.fourth_try.passed":false}]})
...