1

我对 JSONiq 还很陌生,我需要帮助来使用过滤器编写连接。

假设我有两个集合,$C1 和 $C2

我想通过匹配 $C1 和 $C2 之间的 ID 来查找(加入/过滤)$C2 中的所有项目,但是由于 $C1 是一个集合,我不能做我通常做的事情,即

let $filteredC2 := $C2[$C2.ID eq 5],不幸的是,我从在线教程中学到了这种加入/过滤的方式,这与示例一样复杂,

当我写let $filteredC2 := $C2[$C2.ID eq $C1.ID]我得到以下错误: sequence of more than one item cannot be promoted to parameter type xs:anyAtomicType? of function value-equal()

我明白这个问题显然是我做不到的eq $collection,但是我还能如何编写这个过滤器,以便我从 $C2 中找到与 $C1 具有相同 ID 的所有项目?谢谢。

4

1 回答 1

0

JSONiq 确实完全支持连接。有两种方法:

  • 使用 where 子句(如 SQL 中):

    for $c1 in $C1
    for $c2 in $C2
    where $c1.ID eq $c2.ID
    (: more clauses :)
    return { (: any combination of data coming from $c1 or $c2 :) }
    
  • 带有谓词:

    for $c1 in $C1
    for $c2 in $C2[$$.ID eq $c1.ID]
    (: more clauses :)
    return { (: any combination of data coming from $c1 or $c2 :) }
    

JSONiq 还支持半外连接,例如,如果 $C2 中的 $c1 不匹配:

  for $c1 in $C1
  for $c2 allowing empty in $C2[$$.ID eq $c1.ID]
  (: more clauses :)
  return { (: any combination of data coming from $c1 or $c2 :) }

最后,JSONiq 允许您通过将来自 C2 的数据嵌套到 C1 中来使用连接对数据进行非规范化:

for $c1 in $C1
let $c2 := $C2[$$.ID eq $c1.ID]
(: more clauses :)
return {|
  $c1,
  { "C2" : [ $c2 ] }
|}

每个引擎都以不同的方式优化连接。RumbleDB可以检测许多连接模式(也比上面显示的更复杂),以避免对大量数据进行完整的笛卡尔积计算。

于 2021-09-20T09:04:17.813 回答