在 JMESpath 中链接过滤器
Chaining filters in JMESpath
我希望能够使用 JMESpath 将多个过滤器链接在一起,但您似乎无法对过滤器的输出进行过滤。
我的工作示例如下:
// document:
{
pips: {
ancestors:[{
id: 'p01234567'
}],
episode: {
more: 'data',
goes: 'here
}
}
}
// working filter: `[pips][?ancestors[?pid=='p01234567'] && episode]`
但我想改为如下编写我的过滤器,以有效地过滤另一个过滤器的输出:
[pips][?ancestors[?pid=='p01234567']][?episode]
知道为什么这不起作用吗?
我正在使用以下 NPM 包在 NodeJS 中构建它:https://www.npmjs.com/package/jmespath
我使用的语法是否有错误,我使用的库中是否存在错误,或者我只是想做一些超出 JMESpath 允许范围的事情?
谢谢!
我找到了原因 - 投影分两步计算,left-hand-side 创建一个 JSON 初始值数组,right-hand-side 是表达式。
解决方案:“管道表达式”允许您“对投影结果进行操作”。
因此,而不是之前的错误表达式:[pips][?ancestors[?pid=='p01234567']][?episode]
这应该写成:[pips][?ancestors[?pid=='p01234567']] | [?episode]
并且要撤消初始文档到数组的转换,我们可以将其转换回这样的对象:[pips][?ancestors[?pid=='p01234567']] | [?episode] | [0]
附带说明一下,我观察到使用圆括号 ()
也有效,但使用管道更简洁。
我希望能够使用 JMESpath 将多个过滤器链接在一起,但您似乎无法对过滤器的输出进行过滤。
我的工作示例如下:
// document:
{
pips: {
ancestors:[{
id: 'p01234567'
}],
episode: {
more: 'data',
goes: 'here
}
}
}
// working filter: `[pips][?ancestors[?pid=='p01234567'] && episode]`
但我想改为如下编写我的过滤器,以有效地过滤另一个过滤器的输出:
[pips][?ancestors[?pid=='p01234567']][?episode]
知道为什么这不起作用吗?
我正在使用以下 NPM 包在 NodeJS 中构建它:https://www.npmjs.com/package/jmespath 我使用的语法是否有错误,我使用的库中是否存在错误,或者我只是想做一些超出 JMESpath 允许范围的事情?
谢谢!
我找到了原因 - 投影分两步计算,left-hand-side 创建一个 JSON 初始值数组,right-hand-side 是表达式。
解决方案:“管道表达式”允许您“对投影结果进行操作”。
因此,而不是之前的错误表达式:[pips][?ancestors[?pid=='p01234567']][?episode]
这应该写成:[pips][?ancestors[?pid=='p01234567']] | [?episode]
并且要撤消初始文档到数组的转换,我们可以将其转换回这样的对象:[pips][?ancestors[?pid=='p01234567']] | [?episode] | [0]
附带说明一下,我观察到使用圆括号 ()
也有效,但使用管道更简洁。