2

私がやろうとしているのは、次のようなオブジェクトのリストからのオブジェクトが含まれているSELECT metadata->name, metadata->namespace場合のみです:spec.volumessecretName = '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条項に誤りがありますか? いいえ、最後から削除する> 0と、同じ例外がスローされます。

この質問/回答から逆算して、私も試しました。

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->secret->secretName AS [secretNames]正義は譲歩しundefinedます。

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

裸の@v配列を返すと、以前の場所、つまり、フィルター処理できないように見える配列を含む行に戻ります。

4

1 に答える 1

1

問題は にありspec->volumesます。@v->0->secret->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 /、 array のすべての要素をループしますspec.volumes[]

于 2016-08-19T09:16:36.947 に答える