【问题标题】:merge array in to objects into MongoDB将数组合并到对象到 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
      }
   ]
}

【问题讨论】:

    标签: arrays mongodb mongoose mongodb-query aggregation-framework


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        相关资源
        最近更新 更多