$objectToArray (aggregation)

在本页面

Definition

将文档转换为数组。返回数组包含原始文档中每个字段/值对的元素。返回数组中的每个元素都是一个文档,其中包含两个字段kv

$objectToArray具有以下语法:

{ $objectToArray: <object> }

<object>表达式可以是任何有效的expression,只要它解析为文档对象即可。 $objectToArray适用于其参数的顶级字段。如果参数是本身包含嵌入式文档字段的文档,则$objectToArray不会递归地应用于嵌入式文档字段。

有关表达式的更多信息,请参见Expressions

Behavior

有关表达式的更多信息,请参见Expressions

Example Results
{ $objectToArray: { item: "foo", qty: 25 } } [

{
“ k”:“ item”,
“ v”:“ foo”
},
{
“ k”:“数量”,
“ v”:25
}
]
{$ objectToArray:{
item: "foo",
qty: 25,
size: { len: 25, w: 10, uom: "cm" }
} }
[
{
“ k”:“ item”,
“ v”:“ foo”
},
{
“ k”:“数量”,
“ v”:25
},
{
“ k”:“大小”,
“ v”:{
“ len”:25,
“ w”:10,
“ uom”:“ cm”
}
}
br]

Examples

$objectToArray Example

考虑包含以下文档的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 } }

See also

$arrayToObject

首页