提问人:Marco R 提问时间:11/11/2023 最后编辑:Marco R 更新时间:11/11/2023 访问量:34
如何将 json 数组转换为具有预定义键值的键/值对
How to transform json array to key/value pairs with predefined key values
问:
我有一个 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
}
]
}
]
我仍然需要使用度量值名称列表而不是“标签”。
答:
0赞
ray
11/11/2023
#1
按照 @Joe 在注释中给出的想法,您可以使用 通过度量和 中的值来构造对。然后将其整理成一个 k-v 元组数组并用于转换它。最后使用更新回集合。$zip
array
$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
这是一个很好的解决方案。我使用不同的方法得到了部分结果,但我无法将所有部分放在一起。这是我需要的输出。谢谢。
下一个:计算非唯一数组元素的顺序
评论
zip
map
reduce
”array": [ 7, 98, 2, 35, 76 ]”
[“val0”, “val1”, “val2”, “val3”, “val4”]