MongoDB聚合运算符:$arrayToObject

MongoDb聚合运算符$arrayToObject可以将一个数组转换为文档。注意只有两种数组才可以转换为文档,参见$arrayToObject使用

语法

{ $arrayToObject: <expression> }

<expression>必须是数组或能够被解析为数组的表达式,而且数组元素要么是只有两个元素的数组,要么是包含kv两个字段的文档数组。

使用

注意,不是所有的数组表达式都能转换为文档,只有下面两种数组才可以进行转换:

  1. 只有两个元素的数组,第一个元素为字段名,第二个元素为字段值:

    [ [ [ "item", "abc123" ], [ "qty", 25 ] ] ]
    
  2. 包含两个字段的文档数组,一个字段是k一个字段是v

    1. 字段k包含了字段名
    2. 字段v包含了字段值
    [ [ { "k": "item", "v": "abc123" }, { "k": "qty", "v": 25 } ] ]
    
例子返回
{ $arrayToObject: [[ { "k": "item", "v": "abc123" }, { "k": "qty", "v": "$qty" } ]] }当文档字段qty的值为25时,返回:{ "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" }

举例

$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 ] ] }

下面的聚合管道使用$arrayToObjectdimensions数组字段转换为文档:

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 } }

objectToAarry和$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 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值