Select 嵌套列表列表的第一个元素

Select first element of a nested list of lists

我试图在 JMESpath 的列表列表中获取每个嵌套列表中的第一个元素。具体来说,我正在尝试以下变体:

aws redshift-data get-statement-result \
  --id 0de36215-f1db-421f-8704-3242e1a03f21 \
  --query 'Records[][0]'

不幸的是,这导致父列表首先被展平,因此我只得到第一个列表的第一个元素。

输入数据(简体)为:

{   
    "Records": [
        [{"stringValue": "rdsdb"},{"etc": 1}],
        [{"stringValue": "testuser"},{"etc": 100}]
    ],
    "ColumnMetadata": [{"etc": true}],
    "TotalNumRows": 2
}

鉴于该输入数据,我期望的输出是:

[
    {"stringValue": "rdsdb"},
    {"stringValue": "testuser"}
]   

如何获取列表列表中每个嵌套列表中的第一个元素?

根据我从您的评论中收集到的信息,您过度简化了您的示例并且您实际上是在追求整个对象,而不是单个 属性。

根据该要求,您可以使用 [*] 而不是 [] 来实现它,如 the first one does not flatten projections, compared to the second one

因此,给定 JSON 输入:

{   
    "Records": [
        [{"stringValue": "rdsdb", "some-property": "foo"},{"etc": 1}],
        [{"stringValue": "testuser"},{"etc": 100}]
    ],
    "ColumnMetadata": [{"etc": true}],
    "TotalNumRows": 2
}

查询:

Records[*][0]

产生预期的结果:

[
  {
    "stringValue": "rdsdb",
    "some-property": "foo"
  },
  {
    "stringValue": "testuser"
  }
]

否则,您可以使用过滤投影过滤掉数组 Records 中的所有对象,如果键 stringValue 不是 null[?stringValue]

但是因为 [] 正在创建投影,正如您提出的那样,您必须 stop that projection first, with the pipe operator |,如链接文档章节中所述。

所以给出:

Records[]|[?stringValue]

这会产生预期的结果:

[
  {
    "stringValue": "rdsdb"
  },
  {
    "stringValue": "testuser"
  }
]