MongoDBのfindAndModify()を使用して配列を更新する方法
配列を更新する場合、MongoDBでは findAndModify() メソッドを使用します。この記事では、実際のコード例を通じて、条件に一致した配列内の特定の要素を更新する手順をわかりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo152.insertOne({"id":102,"Name":["Chris","David"],Score:45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3515bcfdf09dd6d08539dd")
}
> db.demo152.insertOne({"id":103,"Name":["Mike","Carol"],Score:65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3515cafdf09dd6d08539de")
}
ドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo152.find();
次のような出力が得られます。
{ "_id" : ObjectId("5e3515bcfdf09dd6d08539dd"), "id" : 102, "Name" : [ "Chris", "David" ], "Score" : 45 }
{ "_id" : ObjectId("5e3515cafdf09dd6d08539de"), "id" : 103, "Name" : [ "Mike", "Carol" ], "Score" : 65 }
配列を更新するクエリ
以下は、findAndModify()を使用して配列を更新するクエリの例です。
> var d = db.demo152.findAndModify({
... query: {
... id:102,
... Score: {$lt:50},
... Name: "Chris"
... },
... update: {
... $set : {"Name.$": "Robert"},
... $inc: {Score: 20 }
... }
... }
...
... )
このクエリでは、query部分で「idが102」「Scoreが50未満」「Name配列に"Chris"が含まれている」という3つの条件を指定し、該当するドキュメントを検索しています。
update部分では、位置演算子($)を使って条件に一致した配列要素"Chris"を"Robert"に置き換え($set)、同時にScoreフィールドへ20を加算($inc)しています。位置演算子$は、クエリ条件にマッチした配列要素を自動的に識別してくれるため、インデックス番号を意識せずに更新できるのがポイントです。
更新結果の確認
再度find()メソッドを実行して、すべてのドキュメントを表示してみましょう。
> db.demo152.find();
次のような出力が得られます。
{ "_id" : ObjectId("5e3515bcfdf09dd6d08539dd"), "id" : 102, "Name" : [ "Robert", "David" ], "Score" : 65 }
{ "_id" : ObjectId("5e3515cafdf09dd6d08539de"), "id" : 103, "Name" : [ "Mike", "Carol" ], "Score" : 65 }
出力を確認すると、idが102のドキュメントでは、Name配列の要素"Chris"が"Robert"に置き換わり、Scoreも45から65に更新されていることがわかります。一方、idが103のドキュメントはクエリ条件に一致しないため、何も変更されていません。このようにfindAndModify()を使えば、検索と更新を1回の操作で安全かつ効率的に行うことができます。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i