将数组合并到对象到 MongoDB

Posted

技术标签:

【中文标题】将数组合并到对象到 MongoDB【英文标题】:merge array in to objects into MongoDB 【发布时间】:2021-10-25 12:48:08 【问题描述】:

说明:我必须将数组TVvalues 合并为对象内部的一个数组。 TV_values 将作为一个数组输出。


   "TV":[
      
         "T":"2018-05-05T09:00:00.000Z",
         "V":1.3
      ,
      
         "T":"2018-05-05T09:00:00.000Z",
         "V":2.21
      
   ],
   "values":[
      100,
      200
   ]

预期的输出文档


   "TV_values":[
      
         "T":"2018-05-05T09:00:00.000Z",
         "date":2018-05-05,
         "hour": 09, 
         "V":1.3,
         "values":100
      ,
      
         "T":"2018-05-05T09:00:00.000Z",
         "date":2018-05-05,
         "hour": 09, 
         "V":2.21,
         "values":200
      
   ]

【问题讨论】:

【参考方案1】:

在索引上使用映射的解决方案。$map 在计数范围(索引上的映射)上,获取两个数组的元素并将它们合并。 (需要相同尺寸的电视和 VALUES)

它忽略 V 字段,通过索引 TV index 0 与 Value index 0 合并,TV index 1 与 Value index 1 ,我想这就是你想要的。

Test code here

db.collection.aggregate([
  
    "$project": 
      "TV_VALUES": 
        "$map": 
          "input": 
            "$range": [0,"$size": "$TV"]
          ,
          "as": "i",
          "in": 
            "$let": 
              "vars": 
                "tv": "$arrayElemAt": ["$TV","$$i"]
                
              ,
              "in": 
                "$mergeObjects": [
                  "$$tv",
                  
                    "date": 
                      "$dateToString": 
                        "date": "$toDate": "$$tv.T",
                        "format": "%Y-%m-%d"
                      
                    ,
                    "hour": "$hour": "$toDate": "$$tv.T"
                  ,
                  
                    "values": 
                      "$arrayElemAt": ["$values","$$i"]
                    
                  
                ]
              
            
          
        
      
    
  
])

【讨论】:

【参考方案2】: $map 迭代 TV 数组的循环 $indexOfArrayTV 数组中获取当前元素的索引 $arrayElemAtvalues 数组中获取特定的索引元素 $toDate 将字符串日期转换为日期类型 $dateToSting 获取格式化日期 $hourT 日期获取小时 $mergeObjects 将当前对象属性与新值`属性合并
db.collection.aggregate([
  
    $project: 
      "TV_values": 
        $map: 
          input: "$TV",
          in: 
            $mergeObjects: [
              "$$this",
              
                hour:  $hour:  $toDate: "$$this.T"  ,
                date: 
                  $dateToString: 
                    date:  $toDate: "$$this.T" ,
                    format: "%Y-%m-%d"
                  
                ,
                values: 
                  $arrayElemAt: [
                    "$values",
                     $indexOfArray: ["$TV.V", "$$this.V"] 
                  ]
                
              
            ]
          
        
      
    
  
])

Playground

【讨论】:

感谢您的回答:我收到错误消息:'$arrayElemAt 的第二个参数必须在服务器上可以表示为 32 位整数:1.2'。 .我使用的是 mongo db 4.2 版本。 只需要TV_values 中的values。第一个位置是什么意思? 您可以将TV 中的任何字段作为参考。不,没有唯一的归档 是的,没关系,但我将 V 设为浮点数,而不是整数,我发布了整数值的问题 [mongoplayground.net/p/vozZgALpUPQ](游乐场)也使用浮点数。 不,它不是完美的工作,但如果我做一轮 V 然后它工作,但我希望值作为浮动【参考方案3】:

您可以使用此聚合查询:

首先 $unwind 解构数组。 然后根据V位置的索引-1设置每个值。 (V 1 是索引 0(数组中的位置 1),V 2 是索引 1) 然后重新组合以获得最终对象。
db.collection.aggregate([
  
    "$unwind": "$TV"
  ,
  
    "$set": 
      "TV.values": 
        "$arrayElemAt": [
          "$values",
          
            "$subtract": [
              "$TV.V",
              1
            ]
          
        ]
      
    
  ,
  
    "$group": 
      "_id": "$_id",
      "TV": 
        "$push": "$TV"
      
    
  
])

例如here

【讨论】:

以上是关于将数组合并到对象到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

基于键合并两个数组并使用 mongodb 聚合添加新字段

将二维数组合并到对象数组中

如何将具有相同属性的对象合并到一个数组中?

如何在 mongodb 的数组中合并具有相同键的对象?

将元素从一个对象添加/合并到数组内的另一个对象

nodejs通过lodash合并去重由unixtime和Date组成的两个数组