对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

$arrayToObject(表达式操作符)

$arrayToObject

将大量转换为单个文档。

$arrayToObject 通过以下语法实现:

{ $arrayToObject: <expression> }

<expression> 可以是解析为以下内容的任何有效表达式:

  • 由二元素数组组成的数组,其中第一个元素是字段名称,第二个元素是字段值:

    $arrayToObject: [ [ [ "item", "abc123" ], [ "qty", 25 ] ]]

- 或 -

  • 包含 k 和 v 字段的文档数组,其中:

    • k 字段包含字段名称。

    • v 字段包含该字段的值。

    $arrayToObject: [ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": 25 } ]]

如果将空大量传递给 $arrayToObject, MongoDB将创建一个空对象。

如果数组中有重复的字段名称,

  • 从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,使用的值取决于驱动程序。

例子
结果
{ $arrayToObject: [ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": "$qty" } ]] }

对于字段为 qty 且值为 25 的文档,$arrayToObject 返回:

{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [ [ "item", "abc123" ], [ "qty", 25 ]] } }
{ "item" : "abc123", "qty" : 25 }
{ $arrayToObject: { $literal: [ { "k": "item", "v": "123abc" }, { "k": "item", "v": "abc123" }] } }
{ "item" : "abc123" }

从版本4.0.5开始 + ( 3.6.10 + 和3.4.19 +),如果大量中某个字段的名称重复, $arrayToObject将使用该字段的最后一个值。

请考虑包含以下文档的 inventory 集合:

db.inventory.insertMany( [ { _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将使用该字段的最后一个值。

请考虑包含以下文档的 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 } }
给本页内容打分

在此页面上