$objectToArray(集計)
定義
$objectToArray
バージョン3.4.4の新機能。
ドキュメントを配列に変換します。返される配列には、元のドキュメントの各フィールドと値のペアの要素が含まれます。返される配列の各要素は、2 つのフィールド
k
とv
を含むドキュメントです。k
フィールドには、元のドキュメント内のフィールド名が含まれます。v
フィールドには、元のドキュメント内のフィールドの値が含まれます。
$objectToArray
の構文は次のとおりです。{ $objectToArray: <object> } <object>
式がドキュメントオブジェクトを決定する限り、任意の有効な 式にすることができます。$objectToArray
引数の最上位フィールドに適用されます。引数が埋め込みドキュメントフィールドを含むドキュメントである場合、$objectToArray
は埋め込みドキュメントフィールドに再帰的には適用されません。式の詳細については、「式 」を参照してください。
動作
式の詳細については、「式 」を参照してください。
例 | 結果 | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||
|
|
例
$objectToArray
例
以下のドキュメントを持つinventory
コレクションを考えてみましょう。
{ "_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" : "XYZ1", dimensions: { l: 70, w: 75, uom: "cm" } }
次の集計パイプライン操作では、$objectToArray
を使用して dimensions
フィールドをドキュメントとして返します。
db.inventory.aggregate( [ { $project: { item: 1, dimensions: { $objectToArray: "$dimensions" } } } ] )
この操作では、以下を返します。
{ "_id" : 1, "item" : "ABC1", "dimensions" : [ { "k" : "l", "v" : 25 }, { "k" : "w", "v" : 10 }, { "k" : "uom", "v" : "cm" } ] } { "_id" : 2, "item" : "ABC2", "dimensions" : [ { "k" : "l", "v" : 50 }, { "k" : "w", "v" : 25 }, { "k" : "uom", "v" : "cm" } ] } { "_id" : 3, "item" : "XYZ1", "dimensions" : [ { "k" : "l", "v" : 70 }, { "k" : "w", "v" : 75 }, { "k" : "uom", "v" : "cm" } ] }
$objectToArray
ネストされたフィールドを合計する
以下のドキュメントを持つinventory
コレクションを考えてみましょう。
{ "_id" : 1, "item" : "ABC1", instock: { warehouse1: 2500, warehouse2: 500 } } { "_id" : 2, "item" : "ABC2", instock: { warehouse2: 500, warehouse3: 200} }
次の集計パイプライン操作では、 $objectToArray
と$unwind
および$group
を使用して、倉庫ごとの在庫アイテムの合計を計算します。
db.inventory.aggregate([ { $project: { warehouses: { $objectToArray: "$instock" } } }, { $unwind: "$warehouses" }, { $group: { _id: "$warehouses.k", total: { $sum: "$warehouses.v" } } } ])
この操作では、以下を返します。
{ "_id" : "warehouse3", "total" : 200 } { "_id" : "warehouse2", "total" : 1000 } { "_id" : "warehouse1", "total" : 2500 }
$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 } }