MongoDBで1回の更新呼び出しを使ってドキュメント内の2つの別々の配列を更新する方法
MongoDBでは、$push演算子を使用することで、1回の更新呼び出しで複数の配列フィールドに同時に値を追加できます。この記事では、実際のコード例とともに、その具体的な手順をわかりやすく解説します。
準備:サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生名と2種類のゲームスコア(それぞれ配列形式)を持つドキュメントを3件挿入します。
> db.twoSeparateArraysDemo.insertOne({"StudentName":"Larry","StudentFirstGameScore":[98],"StudentSecondGameScore":[77]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b152815e86fd1496b38b8")
}
> db.twoSeparateArraysDemo.insertOne({"StudentName":"Mike","StudentFirstGameScore":[58],"StudentSecondGameScore":[78]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b152d15e86fd1496b38b9")
}
> db.twoSeparateArraysDemo.insertOne({"StudentName":"David","StudentFirstGameScore":[65],"StudentSecondGameScore":[67]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b153315e86fd1496b38ba")
}登録済みドキュメントの確認
次に、find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.twoSeparateArraysDemo.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5c9b152815e86fd1496b38b8"),
"StudentName" : "Larry",
"StudentFirstGameScore" : [
98
],
"StudentSecondGameScore" : [
77
]
}
{
"_id" : ObjectId("5c9b152d15e86fd1496b38b9"),
"StudentName" : "Mike",
"StudentFirstGameScore" : [
58
],
"StudentSecondGameScore" : [
78
]
}
{
"_id" : ObjectId("5c9b153315e86fd1496b38ba"),
"StudentName" : "David",
"StudentFirstGameScore" : [
65
],
"StudentSecondGameScore" : [
67
]
}1回の更新呼び出しで2つの配列を同時に更新する
それでは本題です。$push演算子を使えば、1回のupdate呼び出しで2つの別々の配列に同時に値を追加できます。ポイントは、$pushオブジェクトの中に、更新したい複数のフィールドをカンマ区切りで指定することです。
> db.twoSeparateArraysDemo.update({_id:ObjectId("5c9b152d15e86fd1496b38b9")}, { $push : {
StudentFirstGameScore : 45, StudentSecondGameScore : 99}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })上記の例では、「Mike」のドキュメントに対して、StudentFirstGameScore配列に「45」を、StudentSecondGameScore配列に「99」を同時に追加しています。実行結果の「nModified : 1」から、1件のドキュメントが正常に更新されたことがわかります。
更新結果の確認
値が正しく2つの別々の配列に追加されたかどうか、再度find()メソッドで確認してみましょう。
> db.twoSeparateArraysDemo.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c9b152815e86fd1496b38b8"),
"StudentName" : "Larry",
"StudentFirstGameScore" : [
98
],
"StudentSecondGameScore" : [
77
]
}
{
"_id" : ObjectId("5c9b152d15e86fd1496b38b9"),
"StudentName" : "Mike",
"StudentFirstGameScore" : [
58,
45
],
"StudentSecondGameScore" : [
78,
99
]
}
{
"_id" : ObjectId("5c9b153315e86fd1496b38ba"),
"StudentName" : "David",
"StudentFirstGameScore" : [
65
],
"StudentSecondGameScore" : [
67
]
}ご覧のとおり、「Mike」のドキュメントだけが更新され、両方の配列に新しいスコアが追加されていることが確認できました。他のドキュメントには影響していません。
ポイントまとめ
- $push演算子は、1回の呼び出しで複数の配列フィールドを同時に更新できる
- 各フィールドへの追加値は、$pushオブジェクト内にカンマ区切りで指定する
- 意図しないドキュメントを更新しないよう、_idなどの一意な条件で対象を絞り込むのが確実
-
MongoDBのaggregate()と$setUnionを使って、1つのドキュメント内の2つの配列から一意の値を取得する方法
MongoDBでは、1つのドキュメントに含まれる複数の配列フィールドから重複を除いた値(一意の値)を取得したいケースがあります。そんなときに便利なのが、集計フレームワーク(aggregate())で使える $setUnion 演算子です。$setUnion は2つ以上の配列を受け取り、いずれかの入力配列に出現する要素をすべて含む配列を返します。このとき重複した要素は自動的に取り除かれるため、手動でのフィルタリングが不要になります。サンプルコレクションの作成まずは、2つの名前リストを持つドキュメントを含むコレクションを作成しましょう。以下のコマンドで demo608 コレクションにドキュメントを
-
MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)
MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って