やり方
Mongo公式ドキュメントの$setとarrayFiltersを利用する
実例
このようなドキュメントを持つコレクションがある時。
{"_id":1,"grades":[{"grade":80,"mean":75,"std":6},{"grade":85,"mean":90,"std":4},{"grade":85,"mean":85,"std":6}]}{"_id":2,"grades":[{"grade":90,"mean":75,"std":6},{"grade":87,"mean":90,"std":3},{"grade":85,"mean":85,"std":4}]}
idが2のドキュメント内で、「grades配列のgradeの値が90であるオブジェクト」のmeanの値を100にしたいとする。(日本語が長いな...)
以下のようなコードとなる。
hoge.updateOne({"_id":2},{$set:{"grades.$[element].mean":100}},{arrayFilters:[{"element.grade":90}]})
hogeはコレクション名。第一引数はドキュメントのフィルタ。(このへんは説明を割愛)
第二引数で配列(grades)と更新したいフィールド(mean)、値(100)をセットする。$[element]は識別子。
第三引数で特定の配列内の検索条件を指定。第二引数で指定した識別子を使う。
結果
{"_id":1,"grades":[{"grade":80,"mean":75,"std":6},{"grade":85,"mean":90,"std":4},{"grade":85,"mean":85,"std":6}]}{"_id":2,"grades":[{"grade":90,"mean":100,"std":6},// mean:75 -> mean:100{"grade":87,"mean":90,"std":3},{"grade":85,"mean":85,"std":4}]}