如何迭代数组的对象以从 JSON 对象中获取特定的键值对。我正在使用 Couchbase 服务器。请为 Couchbase 建议 N1QL。
下面是我的JSON格式
{
"A":{
"B":{
"C": {
"D":[
{
"attr":[
{
"Name" : "abc"
}
],
"Name" : "outer"
}
],
"E":[
{
"attr":[
{
"Name" : "xyz"
}
],
"Name" : "outer1"
}
]
}
}
}
}
想要在对象 C 的每个数组中检索 Name 属性的值。请注意 Array 中有两个同名的字段,所以只想访问外部的一个。 C 中的键值对是动态的。
提前致谢!
最佳答案
如果你真的在寻找路径 A.B.C 的所有名称对象 使用以下表达式
ARRAY v.Name FOR v WITHIN A.B.C WHEN v.Name IS NOT MISSING END
SELECT ARRAY v.Name
FOR v WITHIN d.A.B.C
WHEN v.Name IS NOT MISSING
END AS val
FROM [{ "A":{ "B":{ "C": { "D":[{"Name" : "test1", "state" : "state1"} ],
"E":[{"Name" : "test2", "state" : "state2"} ],
"F":[{"Name" : "test2", "state" : "state2"} ]
}
}
}
}
] AS d;
{
"val": [
"test1",
"test2",
"test2"
]
}
如果您只需要选择一些,则需要在该对象中始终存在一些其他字段。
ARRAY v.Name FOR v WITHIN A.B.C WHEN v.Name IS NOT MISSING AND v.attr IS NOT MISSING END
SELECT ARRAY v.Name FOR v WITHIN d.A.B.C WHEN v.Name IS NOT MISSING AND v.attr IS NOT MISSING END
FROM [{ "A":{ "B":{ "C": { "D":[ { "attr":[ { "Name" : "abc" } ], "Name" : "outer" } ], "E":[ { "attr":[ { "Name" : "xyz" } ], "Name" : "outer1" } ] } } } }] AS d;
如果您已经知道预定义的路径(不要使用递归)。 构造动态字段对象值的 ARRAY。由于该值已经被 ARRAY 扁平化了 1 级,因此遍历 ARRAY 并获得名称。如果您需要独特的使用 ARRAY_DISTINCT()
ARRAY v.Name FOR v IN ARRAY_FLATTEN((ARRAY nv FOR n:nv IN d.A.B.C END),1) END
SELECT ARRAY v.Name FOR v IN ARRAY_FLATTEN((ARRAY nv FOR n:nv IN d.A.B.C END),1) END AS obj
FROM [{ "A":{ "B":{ "C": { "D":[ { "attr":[ { "Name" : "abc" } ], "Name" : "outer" } ], "E":[ { "attr":[ { "Name" : "xyz" } ], "Name" : "outer1" } ] } } } }] AS d;
关于arrays - Couchbase 中数组的迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69225177/