Обновите все записи вложенного массива, если поле не существует в mongodb - PullRequest
0 голосов
/ 26 мая 2020

У меня есть объект ниже. «questions» - это имя документа, и каждый вопрос имеет вложенный массив свойств типа «answers», где некоторые ответы имеют статус вызова свойства.

questions = [
{
    "_id": "idq1"
    "author" :"auth1"
    "Answers": []
},
{
    "_id": "idq2"
    "author" :"auth2"
    "Answers": [
        {
            "author": "auth1",
            "comments" [...],
            "status" : "1"
        },
        {
            "author": "auth2",
            "comments" [...],
        },
        {
            "author": "auth3",
            "comments" [...],
            "status" : "0"
        }
    ]
}
]

Мне нужно обновить все вложенные Answers.status = "1" , где длина ответов> 0 и вложенный элемент status не существует. поэтому результат будет:

questions = [
{
    "_id": "idq1"
    "author" :"auth1"
    "Answers": []
},
{
    "_id": "idq2"
    "author" :"auth2"
    "Answers": [
        {
            "author": "auth1",
            "comments" [...],
            "status" : "1"
        },
        {
            "author": "auth2",
            "comments" [...],
                "status" : "1"
        },
        {
            "author": "auth3",
            "comments" [...],
            "status" : "0"
        }
    ]
}
]

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете использовать arrayFilters для обновления полей массива

Здесь я добавляю запрос на обновление документа по мере необходимости:

Я использовал multi: true вместе с arrayFilter для обновления нескольких документов.

db.questions.update(
  {
    "Answers":{
      $nin:[
        [],
        null
      ]
    }
  },
  {
    $set:{
      "Answers.$[ans].status":"1"
    }
  },
  {
    arrayFilters:[
      {
        "ans.status":{
          $exists:false
        }
      }
    ],
    multi:true
  }
)

Пример вывода

{
    "_id": "idq1"
    "author" :"auth1"
    "Answers": []
},
{
    "_id": "idq2"
    "author" :"auth2"
    "Answers": [
        {
            "author": "auth1",
            "comments": [...],
            "status" : "1"
        },
        {
            "author": "auth2",
            "comments": [...],
            "status" : "1"
        },
        {
            "author": "auth3",
            "comments": [...],
            "status" : "0"
        }
    ]
}

Подробнее о arrayFilters см. здесь .

Надеюсь, это поможет :)

1 голос
/ 26 мая 2020

Мой последний рабочий код:

questions.updateMany(
            {
                "Answers.status" :null
            },
            { $set: { "Answers.$[i].status": 1 } },
            { new: true,
                arrayFilters: [{ "i.status": null}]        
            });
...