$objectToArray (聚合)
定义
$objectToArray
将文档转换为数组。返回数组包含原始文档中每个字段/值对的一个元素。返回数组中的每个元素都是一个文档,包含两个字段
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 } }