【MongoDB】ObjectIdの配列を、元の要素値を含むフィールドを持つ埋め込みドキュメントの配列に変換する方法
MongoDBで配列の各要素を、その値をフィールドとして持つ埋め込みドキュメントに変換したい場合は、aggregate(集計パイプライン)を使用します。$addFieldsステージと$map演算子を組み合わせることで、既存の配列を新しい構造へ書き換えることができます。ObjectIdの配列など、さまざまな型の配列に応用できる便利なテクニックです。
サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。
> db.demo343.insertOne({
... _id: 101,
... UserName: "Chris",
... details: [
... {"Name":"John"},
... {"Name":"David"}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
作成したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo343.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : 101,
"UserName" : "Chris",
"details" : [
{
"Name" : "John"
},
{
"Name" : "David"
}
]
}
配列を埋め込みドキュメントの配列へ変換するクエリ
以下は、配列の各要素の値を「Name」フィールドに格納した埋め込みドキュメントの配列へ変換するクエリです。$map演算子のin式で"$$this"を参照することで、元の配列要素の値をそのまま新しいフィールドに代入できます。
> db.demo343.aggregate([
... {
... $addFields: {
... details: {
... $map: {
... input: "$details",
... in: { Name: "$$this" }
... }
... }
... }
... },
... { $out: "demo343" }
... ])
各ステージ・演算子の役割は次のとおりです。
- $addFields:同名の既存フィールド(details)を上書きし、変換後の配列を設定します。
- $map:配列の各要素に対して処理を適用し、新しい配列を生成します。
- $$this:現在処理中の配列要素そのものを参照する変数です。
- $out:集計結果を指定したコレクション(ここではdemo343)に書き戻します。
変換結果の確認
再度find()メソッドを実行して、結果を確認しましょう。
> db.demo343.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : 101,
"UserName" : "Chris",
"details" : [
{
"Name" : {
"Name" : "John"
}
},
{
"Name" : {
"Name" : "David"
}
}
]
}
このように、$mapと$$thisを活用すれば、配列の各要素の値を保持したまま、任意のフィールド名を持つ埋め込みドキュメントの配列へ柔軟に変換できます。ObjectIdの配列を{ "_id": "$$this" }のようにラップしたい場合などにも、まったく同じ手法が使えますので、ぜひ覚えておきましょう。
-
C#でリストコレクションを配列に変換する方法
C#では、List<T>クラスのToArray()メソッドを使うことで、リストコレクションを簡単に配列へ変換できます。このメソッドは、リスト内のすべての要素を新しい配列にコピーして返します。手順1:リストコレクションを作成するまず、文字列型のリストを作成し、要素を追加します。List<string> myList = new List<string>(); myList.Add(RedHat); myList.Add(Ubuntu);手順2:ToArray()メソッドで配列に変換する次に、ToArray()メソッドを呼び出すだけで、リストが配列に変換されます
-
【C#入門】2次元配列を1次元配列に変換する方法をわかりやすく解説
C#で2次元配列を1次元配列に変換するには?プログラミングでは、2次元配列のデータを1次元配列として扱いたい場面がよくあります。C#では、ネストしたforループとカウンタ変数を組み合わせることで、2次元配列の全要素を1次元配列へ簡単にコピーできます。本記事では、その具体的な手順とサンプルコードを解説します。手順1:2次元配列と1次元配列を宣言するまず、変換元となる2次元配列と、変換先となる1次元配列を用意します。int[] a = new int[2, 2] {{1,2}, {3,4}}; int[] b = new int[4];ここでのポイントは、1次元配列のサイズを「行数 × 列数」で指