JSONata 性能/效率假设
JSONata performance / efficiency assumptions
我真的很喜欢 JSONata——很棒的库,谢谢!
我一直在玩的一件事是在特定键值上连接两个对象数组。
考虑库示例(稍微简化):
library.loans@$L.books@$B[$L.isbn=$B.isbn].{
'customer': $L.customer,
'book': $B.title
}
我(从您的文档等)得到的印象是,这会为 loans 数组中的每个条目迭代 books 数组,然后过滤输出。
问题 1:从性能的角度来看,这是正确的思考方式吗?以 .loans 还是 .books 开头有关系吗?快速测试显示代码可以用任何一种方式编写...凭直觉我会想象如果我有一个预过滤器(例如,只看 'overdue' 贷款),那么如果我从贷款开始并首先过滤它,我可以提高性能。听起来很有道理,还是草率下结论?
问题 2:使用映射重写此查询是否更有效(对于较大的数据集,显然),对于 O(m+n) 而不是 O (m*n)?我的意思是:
(
$booksById := library.books{$.isbn: $};
library.loans.{
'customer': $.customer,
'book': $lookup( $booksById, $.isbn ).title
}
)
再次感谢图书馆——简单易学且非常有用。
Q1:在这种情况下,你怎么写都没有什么区别。在内部,它创建一个元组流,其中包含贷款和书籍的所有排列,然后通过谓词表达式进行过滤。
Q2:这可能更有效(提示:查看 $distict()
函数),但它会给出不同的结果。原始表达式正在执行内部联接(在 SQL 术语中),而您的替代表达式是外部联接 - 即即使该书不存在,它也会生成一个借阅对象。
感谢您的反馈,顺便说一句。
我真的很喜欢 JSONata——很棒的库,谢谢!
我一直在玩的一件事是在特定键值上连接两个对象数组。
考虑库示例(稍微简化):
library.loans@$L.books@$B[$L.isbn=$B.isbn].{
'customer': $L.customer,
'book': $B.title
}
我(从您的文档等)得到的印象是,这会为 loans 数组中的每个条目迭代 books 数组,然后过滤输出。
问题 1:从性能的角度来看,这是正确的思考方式吗?以 .loans 还是 .books 开头有关系吗?快速测试显示代码可以用任何一种方式编写...凭直觉我会想象如果我有一个预过滤器(例如,只看 'overdue' 贷款),那么如果我从贷款开始并首先过滤它,我可以提高性能。听起来很有道理,还是草率下结论?
问题 2:使用映射重写此查询是否更有效(对于较大的数据集,显然),对于 O(m+n) 而不是 O (m*n)?我的意思是:
(
$booksById := library.books{$.isbn: $};
library.loans.{
'customer': $.customer,
'book': $lookup( $booksById, $.isbn ).title
}
)
再次感谢图书馆——简单易学且非常有用。
Q1:在这种情况下,你怎么写都没有什么区别。在内部,它创建一个元组流,其中包含贷款和书籍的所有排列,然后通过谓词表达式进行过滤。
Q2:这可能更有效(提示:查看 $distict()
函数),但它会给出不同的结果。原始表达式正在执行内部联接(在 SQL 术语中),而您的替代表达式是外部联接 - 即即使该书不存在,它也会生成一个借阅对象。
感谢您的反馈,顺便说一句。