arrays - Couchbase 中数组的迭代对象

标签 arrays loops object couchbase n1ql

如何迭代数组的对象以从 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/

相关文章:

c++ - 引用静态二维数组?

javascript - 无效的字符串长度/分配大小重载 JavaScript

Java增强for循环和IndexOutOfBoundsException?

javascript - 如何在javascript中存储类似的对象

android - 应用程序可处理大数组 “stops working”,但仍继续将日志消息打印到AndroidStudio

c - GCC 对堆栈中的 `array` 和 `&array` 使用相同的地址/指针

c - OpenMP 多个 for 循环

c++ - 在 C++ 中使用 'deque' 的无限循环

javascript - 面向对象的 JavaScript 转换器

arrays - 如何快速创建对象数组?