Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8949

MongoDBで配列内の特定の値だけを更新する

$
0
0

やり方

Mongo公式ドキュメントの$setarrayFiltersを利用する

実例

このようなドキュメントを持つコレクションがある時。

{"_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}]}

Viewing all articles
Browse latest Browse all 8949