如何将 json 数组转换为具有预定义键值的键/值对

How to transform json array to key/value pairs with predefined key values

提问人:Marco R 提问时间:11/11/2023 最后编辑:Marco R 更新时间:11/11/2023 访问量:34

问:

我有一个 API 的输出,该 API 加载到 MongoDB,其结构如下:

{
    "_id": {
      "$oid": "654e74b1325312179d479295"
    },
    "myid": "id123",
    "array": [ 7, 98, 2, 35, 76 ],
  }

数组中的每个条目都有不同的度量值,度量值由它们在数组中的位置标识。我确实将度量的名称作为常量,我想将原始数组转换为键/值对。

度量值名称为:[“val0”, “val1”, “val2”, “val3”, “val4”],它们不是 API 输出的一部分。我是从书面文档中得到的。

我有一个 Python 代码可以遍历数组并输出一个新结构,但我想消除这个额外的步骤,并尝试在没有 Python 的情况下使用 MongoDB 来完成。

我希望输出是这样的:

“数组”: [ {“val0”: 7}, {“val1”: 98}, {“val2”: 2}, {“val3”: 35}, {“val4”: 76} ],

我试图找到一个类似的情况开始,但我找不到任何情况。

--更新--

我得到的最接近的是遵循将 mongo 数组转换为具有键值对的对象

我使用了代码:

db.array_test.aggregate([{
    $match: {
        "myid" : "id123"
        }},
           {
        $unwind: {path : "$array"}},{   $group:{
        _id:"$_id",
        result:{
            $push: {
                label: "$array", value: "$array.values"
                }
            }
        }}])

我得到了:

[
  {
    "_id": {
      "$oid": "654e74b1325312179d479295"
    },
    "result": [
      {
        "label": 7
      },
      {
        "label": 98
      },
      {
        "label": 2
      },
      {
        "label": 35
      },
      {
        "label": 76
      }
    ]
  }
]

我仍然需要使用度量值名称列表而不是“标签”。

数组 JSON MongoDB

评论

1赞 Joe 11/11/2023
这应该很简单,用 、 或 ,你试过这些吗?zipmapreduce
0赞 Marco R 11/11/2023
我已经尝试过$map如果我已经在原始 Jason 中拥有键值,它可以工作,即便如此,它也不会产生我需要的东西。它可以为第一个数组元素生成类似 {“7”: 7} 的内容。我看不出zip或reduce如何成为解决方案。你有可用的示例代码吗?我想试试。
0赞 Chukwujiobi Canon 11/11/2023
什么是永远匹配的保证”array": [ 7, 98, 2, 35, 76 ]”[“val0”, “val1”, “val2”, “val3”, “val4”]
0赞 Marco R 11/11/2023
位置 0 将始终为 measure0,positon1 为 measure1,依此类推。大约有 14 个数组,每个数组有 34 个元素,我需要处理。在所有数组中,度量位置始终相同。

答:

0赞 ray 11/11/2023 #1

按照 @Joe 在注释中给出的想法,您可以使用 通过度量和 中的值来构造对。然后将其整理成一个 k-v 元组数组并用于转换它。最后使用更新回集合。$ziparray$arrayToObject$merge

db.collection.aggregate([
  {
    "$set": {
      "array": {
        "$let": {
          "vars": {
            "measures": [
              "val0",
              "val1",
              "val2",
              "val3",
              "val4"
            ]
          },
          "in": {
            "$zip": {
              "inputs": [
                "$$measures",
                "$array"
              ]
            }
          }
        }
      }
    }
  },
  {
    "$set": {
      "array": {
        "$map": {
          "input": "$array",
          "as": "element",
          "in": {
            "$arrayToObject": [
              [
                {
                  "k": {
                    "$first": "$$element"
                  },
                  "v": {
                    "$last": "$$element"
                  }
                }
              ]
            ]
          }
        }
      }
    }
  },
  {
    "$merge": {
      "into": "_id",
      "on": "_id"
    }
  }
])

蒙戈游乐场

评论

0赞 Marco R 11/11/2023
这是一个很好的解决方案。我使用不同的方法得到了部分结果,但我无法将所有部分放在一起。这是我需要的输出。谢谢。