【问题标题】:AlaSQL.js WHERE Clause on a Feld that is an Array of ObjectsAlaSQL.js WHERE 子句在作为对象数组的字段上
【发布时间】:2016-08-20 21:58:39
【问题描述】:

我要做的是SELECT metadata->name, metadata->namespace,但前提是spec.volumes 包含来自如下对象列表的secretName = 'test-secret' 对象:

{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/pods",
  },
  "items": [
    {
      "metadata": {
        "name": "pod1",
        "namespace": "namespace1"
      },
      "spec": {
        "volumes": [
          {
            "name": "default-token",
            "secret": {
              "secretName": "default-token"
            }
          }
        ],
        "nodeName": "node-1"
      }
    }
    {
      "metadata": {
        "name": "pod2",
        "namespace": "namespace2"        
      },
      "spec": {
        "volumes": [
          {
            "name": "default-token",
            "secret": {
              "secretName": "default-token"
            }
          }
        ],
        "nodeName": "node-2"
      }
    },
    {
      "metadata": {
        "name": "chosen-pod",
        "namespace": "namespace3",
      },
      "spec": {
        "volumes": [
          {
            "name": "pod-storage",
          },
          {
            "name": "test-data",
            "secret": {
              "secretName": "test-secret"
            }
          }
        ],
        "nodeName": "node-2",
      }
    }
  ]
}

这个列表被插入到一个表中;

CREATE TABLE pods (node TEXT, metadata Object, spec Object)

我认为这是我最近的一次;

SELECT metadata->name, metadata->namespace, spec->volumes AS volumes FROM pods WHERE (SELECT COUNT(*) FROM ? WHERE secret->secretName = 'test-data') > 0

但这会引发错误:

TypeError: Cannot read property '0' of undefined
    at Object.eval [as datafn] (eval at <anonymous> (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:7487:20), <anonymous>:3:40)
    at ~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6100:19
    at Array.forEach (native)
    at queryfn (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6097:16)
    at Array.statement (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:7121:14)
    at eval [as wherefn] (eval at <anonymous> (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:7899:11), <anonymous>:3:56)
    at doJoin (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6615:12)
    at doJoin (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6687:8)
    at queryfn3 (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6174:2)
    at queryfn2 (~/Documents/myproject/node_modules/alasql/dist/alasql.fs.js:6149:9)

嗯,我的WHERE 子句有错误吗?不,从末尾删除 &gt; 0 会引发相同的异常。

this question/ answer向后工作我也试过;

SEARCH / AS @a
  UNION ALL(
    spec->volumes AS @v
    RETURN(@a->metadata->name AS name, 
      @a->metadata->namespace AS namespace, 
      @v->secret->secretName AS [secretNames]
    )
  ) 
FROM pods

但是@v-&gt;secret-&gt;secretName AS [secretNames] 只会产生undefined

[ 'pod1', 'namespace1', undefined ]
[ 'pod2', 'namespace2', undefined ]
[ 'chosen-pod', 'namespace3', undefined ]

返回裸露的 @v 数组让我回到了原来的位置——一行包含一个我似乎无法过滤的数组。

【问题讨论】:

    标签: sql alasql


    【解决方案1】:

    问题出在spec-&gt;volumes。是一个数组,所以需要把查询改成@v-&gt;0-&gt;secret-&gt;secretName

    SEARCH / AS @a
      UNION ALL(
        spec->volumes AS @v
        RETURN(@a->metadata->name AS name, 
          @a->metadata->namespace AS namespace, 
          @v->0->secret->secretName AS [secretNames]
        )
      ) 
    FROM pods
    

    要提取所需的元素,请尝试以下代码:

    const data = {...data...};
    let res = alasql('SEARCH items / AS @a     \
        spec volumes / WHERE(name="test-data") \
        RETURN(@a->metadata->name AS name,     \
          @a->metadata->namespace AS namespace \
        ) FROM ?',[data]);
    

    这里spec volumes /循环遍历数组spec.volumes[]的所有元素。

    【讨论】:

    • 我是在和作者本人交谈的粉红色!是的,查询第一个元素在两个查询中都有效,但是有没有办法一次查询所有子对象?
    • 抱歉,我没抓住重点。我更改了查询并更新了答案。我只返回有 name = 'test-data' 的元素的元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多