Позиционный оператор $ в MongoDB не обновляет несколько документов - PullRequest
1 голос
/ 30 марта 2019

Ниже приведен модифицированный пример из https://docs.mongodb.com/manual/reference/operator/update/positional/#examples

db.students.insert([
   { "_id" : 1, "grades" : [ 85, 80, 80 ] },
   { "_id" : 2, "grades" : [ 88, 90, 92 ] },
   { "_id" : 3, "grades" : [ 85, 100, 90 ] }
])

db.students.updateOne(
   { _id: 1, grades: 80 },
   { $set: { "grades.$" : 82 } }
   { multi: true }
)'

Я ожидаю, что {multi: true} обновит несколько документов, соответствующих критериям выбора.

На самом деле следующее тоже не работает:

db.students.insert([
       { "_id" : 1, "grades" : [ 85, 82, 82 ] },
       { "_id" : 2, "grades" : [ 88, 90, 92 ] },
       { "_id" : 3, "grades" : [ 80, 100, 90 ] }
    ])

    db.students.updateOne(
       { _id: 1, grades: 80 },
       { $set: { "grades.$" : 82 } }
       { multi: true }
    )'

Я ожидаю, что третий документ будет обновлен до {"_id" : 3, "grades" : [82, 100, 90]}

1 Ответ

1 голос
/ 31 марта 2019

Ваше условие запроса { _id: 1, grades: 80 }, но id:1 имеет grades : [ 85, 82, 82 ]. Третий документ не будет обновлен, поскольку в нем есть _id:3, который не соответствует предложению вашего запроса.

Совет Pro: перед запуском update выполните find, чтобы получить предварительный просмотр того, что может быть обновлено *.

 db.students.find({ _id: 1, grades: 80 })

*find вернет все совпадения, в то время как updateOne обновит не более 1 документа, но по крайней мере вы будете знать, что ваше предложение запроса работает.

...