0

我真的很喜欢 JSONata——很棒的库,谢谢!

我一直在玩弄的一件事是在特定键值上连接两个对象数组。

考虑库示例(有点简化):

library.loans@$L.books@$B[$L.isbn=$B.isbn].{
  'customer': $L.customer,
  'book': $B.title
}

我(从您的文档等)得到的印象是,这会为贷款数组中的每个条目迭代书籍数组,然后过滤输出。

问题 1:从性能的角度来看,这是正确的思考方式吗?以 .loans 还是 .books 开头是否重要?快速测试表明代码可以用任何一种方式编写......直觉上我会想象如果我有一个预过滤器(例如,只查看“过期”贷款),那么如果我从贷款开始并首先过滤它,我可以增加表现。听起来很合理,或者这是在草率下结论?

问题 2:使用映射重写此查询是否更有效(对于更大的数据集,显然),对于 O(m+n) 而不是 O(m*n)?我的意思是:

(
  $booksById := library.books{$.isbn: $};

  library.loans.{
    'customer': $.customer,
    'book': $lookup( $booksById, $.isbn ).title
  }
)

再次感谢图书馆 - 易于学习且非常有用。

4

1 回答 1

1

Q1:在这种情况下,你写它的方式不会有任何区别。在内部,它创建了一个元组流,其中包含贷款和书籍的所有排列,然后由谓词表达式过滤掉。

Q2:这可能更有效(提示:查看$distict()函数),但它会给出不同的结果。原始表达式正在执行内部连接(用 SQL 术语),而您的替代方法是外部连接 - 即,即使该书不存在,它也会为贷款生成一个对象。

感谢您的反馈,顺便说一句。

于 2020-10-30T16:16:05.047 回答