Marklogic 如何获取光学查询返回的记录的uri

Marklogic 如何获取光学查询返回的记录的uri,marklogic,marklogic-dhf,Marklogic,Marklogic Dhf,我编写了一个optic查询来获取文档列表,我需要这些文档的uri let $sql := "select * from table1" let $results := op:from-sql($sql) 我需要$results中所有记录的URI 如何实现这一点?如果改用op:from view,就可以实现这一点。它允许您为系统列提供命名id,如op:fragment id col,并随后将它们加入。要获取包含所有列的所有记录并返回一个额外的数据库uri,您可以执行以下操作:

我编写了一个optic查询来获取文档列表,我需要这些文档的uri

let $sql := "select * from table1"
let $results := op:from-sql($sql)
我需要
$results
中所有记录的URI


如何实现这一点?

如果改用
op:from view
,就可以实现这一点。它允许您为系统列提供命名id,如
op:fragment id col
,并随后将它们加入。要获取包含所有列的所有记录并返回一个额外的数据库uri,您可以执行以下操作:

xquery version "1.0-ml";

import module namespace op="http://marklogic.com/optic"
  at "/MarkLogic/optic.xqy";
 
let $fragmentId := op:fragment-id-col("fragmentId") (: name irrelevant, just needs to be unique :)
return op:from-view("myschema", "table1", (), $fragmentId)
  => op:join-doc-uri(op:col("uri"), $fragmentId)
  => op:limit(10)
  => op:result()
注意:一次运行整个记录集可能无法很好地扩展。最好一页一页地浏览,并将结果分块显示

我还想指出,如果只需将uri作为额外列添加到视图中,就可以避免连接,从而提高性能。您可以在TDE模板中填充它


我有一个复杂的sql查询来返回正确的文档。它具有多个表的联接。在上面的示例中,我将添加我的查询您可以在SQL语句中进行联接的事实就是
op:from SQL
不提供片段列的原因;它不知道要找哪张桌子。理论上,您可以在sql计划和视图计划之间执行一个
op:join-internal
,以混合到片段列中,但是如果不拼写所有列,您将得到每列两次,并且您还必须拼写连接列。同样,我认为预先计算节点uri是迄今为止最简单的解决方案。