Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$arrayToObject(集計)

項目一覧

  • 定義
  • 動作
$arrayToObject

配列を単一のドキュメントに変換します。配列は次のいずれかである必要があります。

  • 2 つの要素からなる配列のうちの 1 つで、最初の要素がフィールド名、2番目の要素がフィールド値

    [ [ [ "item", "abc123" ], [ "qty", 25 ] ] ]

または

  • 以下のとおり 2 つのフィールドkvを含むドキュメントの配列

    • 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 、値が使用するドライバーは異なります。

結果
{ $arrayToObject: [
[ { "k": "item", "v": "abc123" },
{ "k": "qty", "v": "$qty" } ]
] }

フィールドqtyと値25を含むドキュメントがある場合、 $arrayToObjectは次を返します。

{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [
[ "item", "abc123" ], [ "qty", 25 ]
] } }
{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [
{ "k": "item", "v": "123abc" },
{ "k": "item", "v": "abc123" }
] } }
{ "item" : "abc123" }

バージョン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はそのフィールドの最後の値を使用します。

以下のドキュメントを持つ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 } }

Tip

以下も参照してください。

戻る

$arrayElemAt

項目一覧