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

相关推荐

  1. MongoDB聚合运算符:$arrayToObject

    2024-02-19 23:32:01       27 阅读
  2. MongoDB聚合运算符:$add

    2024-02-19 23:32:01       34 阅读
  3. MongoDB聚合运算符;$dateToParts

    2024-02-19 23:32:01       26 阅读
  4. MongoDB聚合运算符:$dayOfWeek

    2024-02-19 23:32:01       28 阅读
  5. MongoDB聚合运算符:$dayOfMonth

    2024-02-19 23:32:01       28 阅读
  6. MongoDB聚合运算符;$dateToString

    2024-02-19 23:32:01       23 阅读
  7. MongoDB聚合运算符:$dayOfYear

    2024-02-19 23:32:01       23 阅读
  8. MongoDB聚合运算符:$denseRank

    2024-02-19 23:32:01       18 阅读
  9. MongoDB聚合运算符:$dateTrunc

    2024-02-19 23:32:01       25 阅读
  10. MongoDB聚合运算符:$divide

    2024-02-19 23:32:01       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 23:32:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 23:32:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 23:32:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 23:32:01       20 阅读

热门阅读

  1. Android 11.0 SystemUI禁用长按recent键的分屏功能

    2024-02-19 23:32:01       29 阅读
  2. 【SpringBoot4】如何理解SpringBoot的约定大于配置

    2024-02-19 23:32:01       29 阅读
  3. 蓝桥杯刷题--python-8(2023 填空题)

    2024-02-19 23:32:01       34 阅读
  4. 如何在1Panel上偷渡HTTP/3

    2024-02-19 23:32:01       37 阅读
  5. 代码随想录刷题第34天

    2024-02-19 23:32:01       34 阅读