我真的很喜欢JSONata --太棒了,谢谢!
我一直在玩的事情之一是在一个特定的键值上连接两个对象数组。
考虑一下库示例(稍微简化了一点):
library.loans@$L.books@$B[$L.isbn=$B.isbn].{
'customer': $L.customer,
'book': $B.title
}我得到的印象(从您的文档等)是,它对loans数组中的每个条目迭代图书数组,然后过滤输出。
问题1:从性能的角度来看,这是正确的思维方式吗?一个人从.loans还是.books开始有关系吗?一次快速测试表明代码可以任意编写..。直觉上,我会想象,如果我有一个预过滤器(例如,只是查看‘逾期’贷款),那么如果我从贷款开始并首先过滤它,我可以提高性能。听起来很合理,还是这么做太仓促了?
问题2:使用映射重写这个查询(显然,对于较大的数据集来说),对于O(m+n)而不是O(m*n),会更有效吗?我的意思是:
(
$booksById := library.books{$.isbn: $};
library.loans.{
'customer': $.customer,
'book': $lookup( $booksById, $.isbn ).title
}
)再次感谢你的图书馆--易学又非常有用。
发布于 2020-10-30 16:16:05
Q1:在这种情况下,写它的方式不会有任何不同。在内部,它创建一个元组流,其中包含贷款和书籍的所有排列,然后由谓词表达式过滤。
Q2:这可能更有效(提示:查看$distict()函数),但结果会不同。最初的表达式是执行内部连接(在SQL术语中),而您的替代表达式是外部连接--也就是说,即使书不存在,它也会为贷款生成一个对象。
谢谢你的反馈,BTW。
https://stackoverflow.com/questions/64595766
复制相似问题