$arrayToObject(聚合)
定义
$arrayToObject
将数组转换为单个文档;数组必须是以下之一:
由二元素数组组成的数组,其中第一个元素是字段名称,第二个元素是字段值:
[ [ [ "item", "abc123" ], [ "qty", 25 ] ] ]
- 或 -
包含
k
和v
字段的文档数组,其中: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 ,使用的值取决于驾驶员。
例子 | 结果 | |||||
---|---|---|---|---|---|---|
| 给定一个具有字段
| |||||
|
| |||||
|
从版本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 } }