如何使用另一个过滤器的另一个结果来过滤文档中的元素?

问题描述 投票:0回答:1

用一个例子来解释可能更简单。考虑以下简单的 json:

[
  {"id": 1, "ref":32, "key":10},
  {"id": 2, "ref":32, "key":75},
  {"id": 3, "ref":27, "key":13},
  {"id": 4, "ref":27, "key":42},
  {"id": 5, "ref":438, "key":42}
]

我想使用

jq
选择所有具有
ref
的元素,这样就有一个
ref
key
等于
42
的元素。

select * from table where ref in (select ref from table where key = 42)

我完全被难住了。我已经成功获得了此类参考的数组

'[.[]|select(.key==42).ref]'

我什至不清楚如何在硬编码列表中选择带有

.ref
的元素,例如

这会返回具有

ref == 32
的元素:
.[] | select(.ref == 32)

但是我不知道如何选择列表中具有

ref
的记录
[32,45]

jq
1个回答
0
投票

我什至不清楚如何在硬编码列表中选择带有

.ref
的元素,例如这将返回具有
ref == 32
的元素:
.[] | select(.ref == 32)
但我不知道如何选择列表中具有
ref
的记录
[32,45]

在这种情况下,只需将项目作为流列出即可:

.[] | select(.ref == (32,45))

select ref from table where key = 42

map(select(.key == 42).ref)
会给你数组
[27,438]

select * from table where ref in (…)

使用

as
将先前的结果数组保存到变量中,然后迭代此引用:
… as $ref | .[] | select(.ref == $refs[])

map(select(.key == 42).ref) as $refs | .[] | select(.ref == $refs[])
{
  "id": 3,
  "ref": 27,
  "key": 13
}
{
  "id": 4,
  "ref": 27,
  "key": 42
}
{
  "id": 5,
  "ref": 438,
  "key": 42
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.