繁体   English   中英

如何使用光学 API 加入具有相似值的视图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM