基于 MarkLogic 查询的视图:构建动态列

Tan*_*r B 1 marklogic

这个问题来自这里关于我在 TDE 和光学计划设置中面临的用例的现有问题: MarkLogic Optic API:模板视图配置的动态更新支持

我的模板视图配置中有以下字段用于表MyTable和架构MyView

<column>
   <name>currentDateTime</name>
   <scalar-type>dateTime</scalar-type>
   <val>fn:current-dateTime()</val>
   <nullable>true</nullable>
   <invalid-values>ignore</invalid-values>
</column>
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建与此列等效的基于查询的视图,以便每次针对此视图运行光学计划时动态更新此值,但我在使用 MarkLogic 提供的当前文档时遇到了问题。

我使用文档中概述的以下查询创建基于查询的视图,并将其 XML 输出作为文档插入到我的架构数据库中:

op:from-view("MyTable", "MyView")
   => op:select(("currentDateTime"))
   => op:generate-view("DataHub", "myQBV")
Run Code Online (Sandbox Code Playgroud)

但是,当我查询这个新视图时,日期时间时间戳保持静态并且不会动态更新。

这是我的光学查询:

let $QBV := op:from-view("DataHub", "myQBV")
return $QBV
 =>op:select((op:view-col("myQBV", "currentDateTime")))
 =>op:result()
Run Code Online (Sandbox Code Playgroud)

我是否必须设置额外的步骤才能currentDateTime在光学计划后动态更新该值?

我以具有 data-view-admin 角色的用户身份保留 QBV XML。

And*_*ski 5

应使用 op:as 或 op:bind-as 调用将动态字段配置为 select 或 bind 语句的一部分。这将确保当前日期时间的评估发生在查询时而不是索引时。

op:select(op:as("currentDateTime", ofn:current-dateTime()))
Run Code Online (Sandbox Code Playgroud)
op:bind-as("currentDateTime",ofn:current-dateTime())
Run Code Online (Sandbox Code Playgroud)

虽然这可以在动态视图中完成,但它可能不是最高性能的。请务必分析一些将利用此字段的查询。

光学作为功能:https://docs.marklogic.com/op:as

光学指南:https://docs.marklogic.com/10.0/guide/app-dev/OpticAPI

表达式函数所需的 XQuery 库:https://docs.marklogic.com/10.0/guide/app-dev/OpticAPI#id_94816