将 Array 结构规范化为 mongoDB 中的多个文档

Posted

技术标签:

【中文标题】将 Array 结构规范化为 mongoDB 中的多个文档【英文标题】:Normalized the Array structure into Multiple documents in mongoDB 【发布时间】:2021-05-31 01:23:42 【问题描述】:

输入是一次文档


  "name": [
    "abc",
    "xyz"
  ],
  "values": [
    "123",
    "100"
  ]

说明我想把Array Normalize into multiple documents,abcxyz是动态来的,这些是用户自定义参数

预期输出

[
    
        "data": 
            "name": "abc",
            "values": "123"
        
    ,
    
        "data": 
            "name": "xyz",
            "values": "100"
        
    
];

【问题讨论】:

namevalues 数组中可以有更多的值吗?它们的大小会不匹配吗? 不,它们不能大小不匹配,valuesname 的数组长度应该相同。 那么计数总是两个呢? 数组个数可以多一些,但个数应该是两个数组的匹配数 【参考方案1】:

你想做的是使用$zip,像这样:

db.collection.aggregate([
  
    $project: 
      data: 
        $map: 
          input: 
            $zip: 
              inputs: [
                "$name",
                "$values"
              ]
            
          ,
          as: "zipped",
          in: 
            name: 
              "$arrayElemAt": [
                "$$zipped",
                0
              ]
            ,
            values: 
              "$arrayElemAt": [
                "$$zipped",
                1
              ]
            
          
        
      
    
  ,
  
    $unwind: "$data"
  ,
  
    $replaceRoot: 
      newRoot: 
        data: "$data"
      
    
  
])

Mongo Playground

【讨论】:

【参考方案2】:

试试这个:

db.testCollection.aggregate([
    
        $project: 
            "data": 
                $map: 
                    input:  $zip:  inputs: ["$name", "$values"]  ,
                    as: "item",
                    in: 
                        name:  $arrayElemAt: ["$$item", 0] ,
                        values:  $arrayElemAt: ["$$item", 1] 
                    
                
            
        
    ,
     $unwind: "$data" 
]);

【讨论】:

以上是关于将 Array 结构规范化为 mongoDB 中的多个文档的主要内容,如果未能解决你的问题,请参考以下文章

从 mongoDB 迁移到 clickhouse 中的嵌套数据结构

array_reduce — 用回调函数迭代地将数组简化为单一的值

array_reduce — 用回调函数迭代地将数组简化为单一的值

将行非规范化为列是不是会提高 SQL Server 中的性能?

关于MongoDB中对于Collection中的Array数组的注意事项

关于MongoDB中对于Collection中的Array数组的注意事项