MongoDBで配列内の条件に合う要素だけを更新する方法|update()とarrayFiltersの使い方
MongoDBでドキュメントを更新する場合、集計(アグリゲーション)パイプラインを使用することはできません。ドキュメントの更新には update() メソッドを使用します。
この記事では、実際にコレクションを作成し、arrayFilters を使って配列内の特定の条件に一致する要素だけを更新する手順を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは、複数の人の情報を持つ「details」という配列フィールドを含むドキュメントを挿入します。
> db.demo376.insertOne(
... {
... "id" :101,
... "details" : [
... {
... Name:"Chris",
... Age:21,
... Score:45
... },
... {
... Name:"David",
... Age:23,
... Score:67
... },
... {
... Name:"Bob",
... Age:20,
... Score:54
... }
... ]
... }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5a71b92ae06a1609a00b0d")
}2. 挿入したドキュメントの確認
find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo376.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e5a71b92ae06a1609a00b0d"),
"id" : 101,
"details" : [
{
"Name" : "Chris",
"Age" : 21,
"Score" : 45
},
{
"Name" : "David",
"Age" : 23,
"Score" : 67
},
{
"Name" : "Bob",
"Age" : 20,
"Score" : 54
}
]
}3. 条件に一致する配列要素を更新するクエリ
続いて、ドキュメントを更新するクエリを見ていきましょう。ここでは $inc 演算子と arrayFilters を組み合わせて、「Age が 21 かつ Score が 40 より大きい」という条件を満たす配列要素のみを対象に、Age を 3 加算します。
> db.demo376.update(
... {"id" :101},
... {$inc:{"details.$[d].Age":3}},
... {arrayFilters: [ {$and:[{"d.Age": 21},{"d.Score": {"$gt":40}} ]}] }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })クエリのポイント
- $inc:指定したフィールドの数値を増減させる更新演算子です。ここでは Age に 3 を加算しています。
- details.$[d]:位置指定演算子の一種で、arrayFilters で定義した識別子「d」に一致するすべての配列要素を指します。
- arrayFilters:どの配列要素を更新対象にするかを細かく条件指定できるオプションです。$and を使えば複数条件の組み合わせも可能です。
4. 更新後の結果確認
再度 find() メソッドを実行して、更新結果を確認します。
> db.demo376.find().pretty();
実行すると、以下のように Chris の Age のみが「21」から「24」に更新されていることがわかります。他の要素は影響を受けていません。
{
"_id" : ObjectId("5e5a71b92ae06a1609a00b0d"),
"id" : 101,
"details" : [
{
"Name" : "Chris",
"Age" : 24,
"Score" : 45
},
{
"Name" : "David",
"Age" : 23,
"Score" : 67
},
{
"Name" : "Bob",
"Age" : 20,
"Score" : 54
}
]
}まとめ
MongoDBでは、アグリゲーションパイプラインによるドキュメント更新は行えません。ドキュメントの更新には update() を使用し、配列内の特定の要素だけを更新したい場合は arrayFilters を活用すると、柔軟かつ正確な条件指定が可能になります。
-
【初心者向け】MongoDBで条件付き更新(update)を行う方法を徹底解説
MongoDBで条件付き更新を行う基本 MongoDBで条件に一致するドキュメントだけを更新したい場合には、update()メソッドを使用します。この記事では、実際のコード例を通して、条件付き更新の基本的な流れをわかりやすく解説します。 1. サンプルコレクションの作成 まずは、ドキュメントを格納するコレクションを作成しましょう。以下ではinsertOne()メソッドを使って、3件のドキュメントを登録しています。 > db.demo402.insertOne({id:101,"Name":"Chris"}); { &nbs
-
MongoDBでレコードを更新する方法|_idを指定したupdateの基本を解説
MongoDBのレコード更新の基本MongoDBで既存のレコード(ドキュメント)を更新するには、_idフィールドを基準に対象を特定して更新するのが基本です。ここでは、サンプルコレクションを作成し、実際にupdateメソッドを使ってレコードを更新する手順を順番に見ていきましょう。1. サンプルコレクションとドキュメントの作成まず、insertOne()メソッドを使ってコレクション「demo458」にドキュメントを3件挿入します。> db.demo458.insertOne( {_id:101,"Name":"David" } ); { "a