Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象

Mongodb 在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一份像这样的文件 { name:'John Doe', phone: 'XXXXXXX', field1: [ {I:20}, {J:60}, {K:20} ] } 如何重新构造字段1,使其具有名称,而不是匿名。大概是这样的: field1: [ { key: I, value:20 }, { key: J, value:60 }, { key: K, value:20 } ]

我有一份像这样的文件

{
  name:'John Doe',
  phone: 'XXXXXXX',
  field1: [
    {I:20},
    {J:60},
    {K:20}
  ]
}
如何重新构造
字段1
,使其具有名称,而不是匿名。大概是这样的:

field1: [
  {
    key: I,
    value:20
  },
  {
    key: J,
    value:60
  },
  {
    key: K,
    value:20
  }
]

因为我有大量的数据,所以也可以进行批量操作。

您可以使用两种方法进行操作

  • 来自MpngoDB 4.2
  • 使用和收集
  • 使用带有聚合管道的更新
    • 第一个
      $set
      管道,用于将对象转换为
      k
      v
      格式的数组
    • 第二个
      $set
      管道,用于从
      k=>key
      v=>value

    使用
    aggregate()
    $out
    • 两个
      $set
      与上述方法相同
    • $out
      获取聚合管道返回的文档并将其写入指定的集合
    db.collection.aggregate([
    {
    $set:{
    字段1:{
    美元减少:{
    输入:“$field1”,
    初始值:[],
    在:{
    $concatarray:[
    “$$value”,
    {
    $objectToArray:“$$this”
    }
    ]
    }
    }
    }
    }
    },
    {
    $set:{
    字段1:{
    $map:{
    输入:“$field1”,
    作为:“f”,
    在:{
    密钥:“$$f.k”,
    值:“$$f.v”
    }
    }
    }
    }
    },
    {$out:}
    ])
    

    db.collection.updateMany({},
      [{
          $set: {
            field1: {
              $reduce: {
                input: "$field1",
                initialValue: [],
                in: {
                  $concatArrays: [
                    "$$value",
                    {
                      $objectToArray: "$$this"
                    }
                  ]
                }
              }
            }
          }
        },
        {
          $set: {
            field1: {
              $map: {
                input: "$field1",
                as: "f",
                in: {
                  key: "$$f.k",
                  value: "$$f.v"
                }
              }
            }
          }
        }
      ]
    )
    
    db.collection.aggregate([
      {
        $set: {
          field1: {
            $reduce: {
              input: "$field1",
              initialValue: [],
              in: {
                $concatArrays: [
                  "$$value",
                  {
                    $objectToArray: "$$this"
                  }
                ]
              }
            }
          }
        }
      },
      {
        $set: {
          field1: {
            $map: {
              input: "$field1",
              as: "f",
              in: {
                key: "$$f.k",
                value: "$$f.v"
              }
            }
          }
        }
      },
      {  $out: <"collection name"> }
    ])