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

lx0bsm1f  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(116)

我有一个来自API的输出,它被加载到MongoDB,结构如下:

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

字符串
数组中的每个条目都有一个不同的度量值,度量值由它们在数组中的位置标识。我确实有度量值的名称作为常量,我想将原始数组转换为键/值对。
度量名称是:[“val 0”,“val 1”,“val 2”,“val 3”,“val 4”],它们不是API输出的一部分。我从书面文档中得到的。
我有一个Python代码,它可以遍历数组并输出一个新的结构,但我想消除这个额外的步骤,并尝试在没有Python的情况下使用MongoDB。
我希望输出像这样:
“array”:[ {“val0”:7},{“val1”:98},{“val2”:2},{“val3”:35},{“val4”:76} ],
我试图找到一个类似的情况开始,但我无法找到任何。
--更新--
我最接近的是跟踪Converting mongo array to object with key-value pair
我使用了代码:

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
      }
    ]
  }
]


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

k3fezbri

k3fezbri1#

按照@Joe在comment中给出的想法,你可以使用$zip来通过度量和array中的值来构造对。然后将其转换为一个k-v元组数组,并使用$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"
    }
  }
])

字符串
Mongo Playground

相关问题