定义
$objectToArray将文档转换为数组。返回数组包含原始文档中每个字段/值对的一个元素。返回数组中的每个元素都是一份包含两个字段
k和v的文档:k字段包含原始文档中的字段名称。v字段包含原始文档中该字段的值。
$objectToArray通过以下语法实现:{ $objectToArray: <object> } The
<object>expression can be any valid expression as long as it resolves to a document object.$objectToArrayapplies to the top-level fields of its argument. If the argument is a document that itself contains embedded document fields, the$objectToArraydoes not recursively apply to the embedded document fields.有关表达式的更多信息,请参阅表达式。
行为
有关表达式的更多信息,请参阅表达式。
例子 | 结果 | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | |||||||||||||||||||||||
| |
示例
$objectToArray 例子
请考虑包含以下文档的 inventory 集合:
db.inventory.insertMany( [ { _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" } } ] )
The following aggregation pipeline operation use the $objectToArray to return the dimensions field as an array:
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 集合:
db.inventory.insertMany( [ { _id: 1, item: "ABC1", instock: { warehouse1: 2500, warehouse2: 500 } } { _id: 2, item: "ABC2", instock: { warehouse2: 500, warehouse3: 200} } ] )
The following aggregation pipeline operation uses the $objectToArray along with $unwind and $group to calculate the total items in stock per warehouse.
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 集合:
db.inventory.insertMany( [ { _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 } }