MongoDBの$unwind演算子で複数の配列を1つの配列に展開する方法
MongoDBで複数の配列を1つの配列として扱いたい場合、アグリゲーション(集計)フレームワークの $unwind 演算子を使用します。$unwind は、配列フィールドの各要素を個別のドキュメントに分解するための演算子です。これにより、ネストされた配列データをフラットな構造に変換できます。
まず、サンプル用のコレクションにドキュメントを挿入してみましょう。
> db.demo289.insertOne({"Section":["A","B","E"],"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c06fcf49383b52759cbc3")
}
> db.demo289.insertOne({"Section":["C","D","B"],"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c070af49383b52759cbc4")
}find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo289.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e4c06fcf49383b52759cbc3"),
"Section" : [ "A", "B", "E" ],
"Name" : "Chris"
}
{
"_id" : ObjectId("5e4c070af49383b52759cbc4"),
"Section" : [ "C", "D", "B" ],
"Name" : "David"
}ご覧のとおり、各ドキュメントには Section という配列フィールドが含まれています。ここで、$unwind を使って配列を展開するクエリを実行します。
> db.demo289.aggregate({ $unwind : "$Section" } );実行結果は以下のようになります。
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "A", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "B", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "E", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "C", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "D", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "B", "Name" : "David" }$unwindの動作のポイント
この結果からわかるように、$unwind は配列フィールド Section の各要素ごとに1つのドキュメントを生成します。元の配列が3つの要素を持っていれば、3つのドキュメントが出力され、それぞれの Section フィールドには配列ではなく単一の文字列値が格納されます。
この手法は、配列内の要素を個別に集計・フィルタリングしたい場合や、複数の配列データを結合して分析したい場合に非常に便利です。たとえば、$group ステージと組み合わせれば、展開した要素ごとの集計処理も簡単に行えます。
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai
-
MongoDBで配列内の単一の値を文字列に置き換える方法
MongoDBで配列内の特定の要素だけを別の文字列に置き換えたい場合、$set 演算子と位置演算子($)を組み合わせて使用します。この記事では、実際のコード例を通じてその手順をわかりやすく解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを持つドキュメントを含むコレクションを作成します。> db.demo564.insertOne({StudentName:[Chris,David,Mike,Sam]});{ acknowledged : true, insertedId : ObjectId(5e90880a39cfeaa