求助:基于try.jsonata.org发票数据构建JSONata去重查询
嘿,我来帮你搞定这个需求!其实不用折腾复杂的$map/$reduce,JSONata本身就有简洁的方式处理嵌套数组筛选和去重,咱们一步步来:
核心查询语句
直接用这行就能搞定你要的结果:
$distinct($.Account.Order[Product.Price < 50].OrderID)
拆解一下逻辑
- 定位订单数组:
$.Account.Order先拿到所有订单的集合 - 筛选符合条件的订单:
[Product.Price < 50]是JSONata的嵌套谓词语法——它会自动遍历当前Order下的所有Product,只要有任意一个Product的Price小于50,就会选中这个Order(这也是你之前可能没get到的点:不用手动遍历Product数组,JSONata会帮你处理子数组的条件判断) - 提取OrderID:
.OrderID把选中订单的ID提取出来,得到一个可能包含重复值的数组 - 去重:
$distinct(...)对提取出的ID数组去重,最终得到唯一的OrderID列表
更明确的写法(可选)
如果想更清晰地表达“存在至少一个低价Product”,可以用$some函数显式判断,效果和上面完全一致:
$distinct($.Account.Order[$some(Product, $.Price < 50)].OrderID)
举个实际例子验证
假设你的发票数据结构是这样的:
{ "Account": { "Order": [ { "OrderID": "1001", "Product": [{"Price": 40}, {"Price": 60}] }, { "OrderID": "1002", "Product": [{"Price": 55}] }, { "OrderID": "1001", "Product": [{"Price": 30}] }, { "OrderID": "1003", "Product": [{"Price": 25}] } ] } }
运行查询后会得到结果:["1001", "1003"],正好是符合条件的唯一OrderID。
内容的提问来源于stack exchange,提问作者MTH
相关产品推荐
相关产品推荐

