MongoDBで配列内の値を置き換えるクエリの書き方
MongoDBで配列内の値を置き換えるには?
MongoDBで配列(array)内の特定の値を置き換えたい場合、更新演算子である $set を使用します。位置指定演算子 $ と組み合わせることで、条件に一致した配列要素だけを効率的に更新できます。
この記事では、実際のコード例を通して、配列内の値を置き換える手順をわかりやすく解説します。
ステップ1:サンプルコレクションを作成する
まず、ドキュメントを含むコレクションを作成しましょう。ここでは学生のスコアが格納された配列を持つドキュメントを挿入します。
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[45,56,78]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7f0421a844af18acdffb7")
}
> db.replaceValueInArrayDemo.insertOne({"StudentScores":[33,90,67]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7f0521a844af18acdffb8")
}
ステップ2:挿入したドキュメントを確認する
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.replaceValueInArrayDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cd7f0421a844af18acdffb7"),
"StudentScores" : [
45,
56,
78
]
}
{
"_id" : ObjectId("5cd7f0521a844af18acdffb8"),
"StudentScores" : [
33,
90,
67
]
}
ステップ3:$setと位置演算子で配列の値を置き換える
ここからが本題です。配列内の値を置き換えるには、update() メソッドに対象ドキュメントの条件と、一致した配列要素を指す位置演算子 $ を指定します。
以下は、ObjectIdが「5cd7f0421a844af18acdffb7」のドキュメントに含まれるスコア「45」を「99」に置き換えるクエリです。
> db.replaceValueInArrayDemo.update({_id: ObjectId("5cd7f0421a844af18acdffb7"), StudentScores:45}, {$set: {'StudentScores.$': 99}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
nModified: 1 と表示されていることから、1件のドキュメントが正常に更新されたことが確認できます。
ステップ4:更新結果を確認する
もう一度 find() メソッドを実行して、ドキュメントが正しく更新されているか確認しましょう。
> db.replaceValueInArrayDemo.find().pretty();
実行結果は以下の通りです。最初のドキュメントの配列内で「45」が「99」に置き換わっていることがわかります。
{
"_id" : ObjectId("5cd7f0421a844af18acdffb7"),
"StudentScores" : [
99,
56,
78
]
}
{
"_id" : ObjectId("5cd7f0521a844af18acdffb8"),
"StudentScores" : [
33,
90,
67
]
}
まとめ
MongoDBで配列内の値を置き換える際のポイントは以下の通りです。
- 更新には
$set演算子を使用する - クエリ条件に配列フィールドと置き換えたい値を指定することで、該当要素を特定できる
- 位置演算子
$(例:'StudentScores.$')を使うことで、条件に一致した配列要素のみを対象に更新できる - なお、最新のMongoDBでは
update()の代わりにupdateOne()やupdateMany()の利用が推奨されています
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "