Docs 菜单

Docs 主页开发应用程序MongoDB Manual

$arrayToObject(聚合)

在此页面上

  • 定义
  • 行为
  • 举例
$arrayToObject

将数组转换为单个文档;数组必须是以下之一:

  • 由二元素数组组成的数组,其中第一个元素是字段名称,第二个元素是字段值:

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

- 或 -

  • 包含 kv 字段的文档数组,其中:

    • k 字段包含字段名称。

    • v 字段包含该字段的值。

    [ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": 25 } ] ]

$arrayToObject 通过以下语法实现:

{ $arrayToObject: <expression> }

<expression> 可以为任何有效的表达式,解析为包含“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 ] ] }

以下聚合管道操作使用$arrayToObjectdimensions字段作为文档返回:

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 } }

提示

另请参阅:

← $arrayElemAt(聚合)

在此页面上