![](/img/trans.png)
[英]Marklogic - Optic API: Joining views by value (op:on does not support values, only column-references)
[英]How do you join views with similar values with the Optic API?
我想使用光学 API 加入两个视图。 连接看起来像这样:
xquery version "1.0-ml";
import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
let $qs := op:from-view("Samplestack", "QnA")
let $users := op:from-view("Samplestack", "Contributors")
return $qs
=> op:join-inner($users, op:on("Asker", "ContributorUserName"))
=> op:select(("QnATitle", "QVoteCount", "Asker", "UserReputation"))
问题是“ContributorUserName”和“Asker”两列并不完全相同。 “Asker”的前缀是“username.”。
所以我需要连接“用户名”。 以及“ContributorUserName”的值。
根据文档,我可以在计划中以某种方式调用 concat function ,因此不必使用 function op:call() 。
但我无法让它工作。
查询应该能够在连接之前使用带有表达式的 select() 操作来修改视图,如下面的草图(未经测试):
=> op:join-inner(
$users => op:select((op:as("PrefixedUserName", ofn:concat((
"username.",op:col("ContributorUserName")
))), ...otherNeededColumns...)),
op:on("Asker", "PrefixedUserName")
)
您可能已经知道,该模块必须导入 ofn 模块才能访问 concat() 表达式 function:
import module namespace ofn="http://marklogic.com/optic/expression/fn"
at "/MarkLogic/optic/optic-fn.xqy";
XQuery 库的所有命名空间都可以在这里找到
唯一需要注意的是(至少目前)加入表达式会强制加入到 enode,而不是在 dnodes 上执行分布式连接。
因此,如果结果集很大,它可能会提高在 TDE 中执行连接的性能,必要时创建两列并使用适合查询的列。 或者,更好的是,修剪 TDE 中其他 Asker 值的前缀(同样,如有必要,创建两列)。
希望有帮助,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.