On this page
$arrayToObject (aggregation)
在本页面
Definition
$arrayToObject
- 3.4.4 版的新功能。
将数组转换为单个文档;数组必须为:
- 一个由两个元素组成的数组,其中第一个元素是字段名称,第二个元素是字段值:
[ [ "item", "abc123"], [ "qty", 25 ] ]
要么 -
包含两个字段
k
和v
的文档数组,其中:k
字段包含字段名称。v
字段包含该字段的值。
[ { "k": "item", "v": "abc123"}, { "k": "qty", "v": 25 } ]
$arrayToObject具有以下语法:
{ $arrayToObject: <expression> }
<expression>
可以是解析为包含“ k”和“ v”字段的两元素数组或文档数组的任何有效expression。
有关表达式的更多信息,请参见Expressions。
Behavior
如果字段名称在数组中重复,
从 3.6.10 开始,$arrayToObject使用该字段的最后一个值。对于 3.6.0-3.6.9,使用的值取决于驱动程序。
从 3.4.19 开始,$arrayToObject使用该字段的最后一个值。对于 3.4.4-3.4.19,使用的值取决于驱动程序。
Example | Results |
---|---|
{$ arrayToObject:{$ literal:[ | |
{ "k": "item", "v": "abc123"}, { "k": "qty", "v": 25 } ]}} |
{ "item" : "abc123", "qty" : 25 } |
{$ arrayToObject:{$ literal:[ [ "item", "abc123"], [ "qty", 25] ]}} |
{ "item" : "abc123", "qty" : 25 } |
{$ arrayToObject:{$ literal:[ | |
100]}} | { "item" : "abc123" } 从版本 3.6.10(和 3.4.19)开始,如果字段名称在数组中重复,则$arrayToObject使用该字段的最后一个值。 |
Examples
$arrayToObject Example
考虑包含以下文档的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 } }
从版本 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 } }
See also