$arrayToObject(集計)
定義
$arrayToObject
バージョン3.4.4の新機能。
配列を単一のドキュメントに変換します。配列は次のいずれかである必要があります。
2 つの要素からなる配列のうちの 1 つで、最初の要素がフィールド名、2番目の要素がフィールド値
[ [ [ "item", "abc123" ], [ "qty", 25 ] ] ]
または
以下のとおり 2 つのフィールド
k
とv
を含むドキュメントの配列k
フィールドには、フィールド名が含まれます。v
フィールドには、フィールドの値が含まれます。
[ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": 25 } ] ]
$arrayToObject
の構文は次のとおりです。{ $arrayToObject: <expression> } <expression>
は、2 つの要素からなる配列うちのひとつ、または "k" フィールドと "v" フィールドを含むドキュメントの配列に解決される任意の有効な式です。式の詳細については、「式 」を参照してください。
動作
フィールド名が配列内で繰り返される場合、
4.0.5以降、
$arrayToObject
は、そのフィールドの最後の値を使用します。 4.0.0の場合 - 4 。 0 。 4 、使用される値はドライバーによって異なります。3.6.10以降、
$arrayToObject
は、そのフィールドの最後の値を使用します。 3.6.0の場合 - 3 。 6 。 9 、使用される値はドライバーによって異なります。3.4.19以降、
$arrayToObject
は、そのフィールドの最後の値を使用します。 3.4.0の場合 - 3 。 4 。 19 、値が使用するドライバーは異なります。
例 | 結果 | |||||
---|---|---|---|---|---|---|
| フィールド
| |||||
|
| |||||
|
バージョン4.0.5 + 以降(3.6.10 + および3.4.19 +)、配列内でフィールド名が繰り返される場合、 はそのフィールドの最後の値 |
例
$arrayToObject
例
以下のドキュメントを持つinventory
コレクションを考えてみましょう。
{ "_id" : 1, "item" : "ABC1", dimensions: [ { "k": "l", "v": 25} , { "k": "w", "v": 10 }, { "k": "uom", "v": "cm" } ] } { "_id" : 2, "item" : "ABC2", dimensions: [ [ "l", 50 ], [ "w", 25 ], [ "uom", "cm" ] ] } { "_id" : 3, "item" : "ABC3", dimensions: [ [ "l", 25 ], [ "l", "cm" ], [ "l", 50 ] ] }
次の集計パイプライン操作では、 $arrayToObject
を使用してdimensions
フィールドをドキュメントとして返します。
db.inventory.aggregate( [ { $project: { item: 1, dimensions: { $arrayToObject: "$dimensions" } } } ] )
この操作では、以下を返します。
{ "_id" : 1, "item" : "ABC1", "dimensions" : { "l" : 25, "w" : 10, "uom" : "cm" } } { "_id" : 2, "item" : "ABC2", "dimensions" : { "l" : 50, "w" : 25, "uom" : "cm" } } { "_id" : 3, "item" : "ABC3", "dimensions" : { "l" : 50 } }
バージョン4.0.5 + 以降 ( 3.6.10 + と3.4.19 +)、配列内でフィールド名が繰り返される場合、 $arrayToObject
はそのフィールドの最後の値を使用します。
$objectToArray
+$arrayToObject
の例
以下のドキュメントを持つinventory
コレクションを考えてみましょう。
{ "_id" : 1, "item" : "ABC1", instock: { warehouse1: 2500, warehouse2: 500 } } { "_id" : 2, "item" : "ABC2", instock: { warehouse2: 500, warehouse3: 200} }
次の集計パイプライン操作は、各アイテムの在庫合計を計算し、instock
ドキュメントに追加します。
db.inventory.aggregate( [ { $addFields: { instock: { $objectToArray: "$instock" } } }, { $addFields: { instock: { $concatArrays: [ "$instock", [ { "k": "total", "v": { $sum: "$instock.v" } } ] ] } } } , { $addFields: { instock: { $arrayToObject: "$instock" } } } ] )
この操作では、以下を返します。
{ "_id" : 1, "item" : "ABC1", "instock" : { "warehouse1" : 2500, "warehouse2" : 500, "total" : 3000 } } { "_id" : 2, "item" : "ABC2", "instock" : { "warehouse2" : 500, "warehouse3" : 200, "total" : 700 } }