在托管文档上使用xPath的Marklogic会生成此文档的所有版本

在托管文档上使用xPath的Marklogic会生成此文档的所有版本,marklogic,marklogic-9,Marklogic,Marklogic 9,在托管(dls:documentinsert和manage(…)文档上使用xpath时,我希望使用 此文档上的xpath表达式,以便仅检索实际文档,特别是对于其他用户 使用xpath,我要么得到文档的所有版本,要么没有文档 我尝试对文档设置权限。 限制URI只是为了创建。 保护路径没有帮助,因为xpath对于所有版本都是相同的 是否有可能限制某些用户仅获取最新版本 我们使用的是Marklogic 9.0.8 例子: 将文档设置为 xquery version "1.0-ml"; import m


在托管(dls:documentinsert和manage(…)文档上使用xpath时,我希望使用 此文档上的xpath表达式,以便仅检索实际文档,特别是对于其他用户

使用xpath,我要么得到文档的所有版本,要么没有文档

我尝试对文档设置权限。
限制URI只是为了创建。
保护路径没有帮助,因为xpath对于所有版本都是相同的

是否有可能限制某些用户仅获取最新版本

我们使用的是Marklogic 9.0.8

例子: 将文档设置为

xquery version "1.0-ml";
import module namespace dls = "http://marklogic.com/xdmp/dls" at "/MarkLogic/dls.xqy";

declare variable $uri :="/smtextdocuments/9114.xml";
declare variable $document := document {
<envelope>
  <instance>
    <smtextdocuments>
      <uri>/smtextdocuments/9114.xml</uri><id>9114</id>
      <documentcontent>MyText</documentcontent>
    </smtextdocuments>
  </instance>
</envelope>
};

let $d := dls:document-insert-and-manage($uri,fn:true(), $document,
        "Manage textdocuments",
        (
         xdmp:permission("dls-user", "read"),
         xdmp:permission("dls-internal", "read"),
         xdmp:permission("dls-internal", "update")),
        ()
        )
return $d
xquery版本“1.0-ml”;
导入模块命名空间dls=”http://marklogic.com/xdmp/dls“at”/MarkLogic/dls.xqy”;
声明变量$uri:=“/smtextdocuments/9114.xml”;
声明变量$document:=文档{
/smtextdocuments/9114.xml9114
我的文本
};
让$d:=dls:document插入并管理($uri,fn:true(),$document,
“管理文本文档”,
(
xdmp:权限(“dls用户”、“读取”),
xdmp:权限(“dls内部”、“读取”),
xdmp:权限(“dls内部”、“更新”),
()
)
返回$d
根据实际用户的权限,检索文档时会导致2个或无元素

xquery version "1.0-ml";
<queryresult>
  <byxPath>{
    for $i in //smtextdocuments[id=9114]
    return (<uri>{fn:base-uri($i)}</uri>,$i)
    }
  </byxPath>
</queryresult>
xquery版本“1.0-ml”;
{
对于//smtextdocuments[id=9114]中的$i
返回({fn:base uri($i)},$i)
}

您正在使用DLS并行存储文档的多个版本,因此如果您查询整个数据库(如果您使用像
//xxx
这样的裸绝对路径,就会发生这种情况),您将获得该文档的所有匹配版本

我会建议切换到使用,例如与。如果您还为
smtextdocuments/id
添加路径索引,则可以准确定位您的文档:

import module namespace dls = "http://marklogic.com/xdmp/dls" 
  at "/MarkLogic/dls.xqy";

cts:search(collection(), cts:and-query((
  dls:documents-query(),
  cts:range-query(
    cts:path-reference('smtextdocuments/id'),
    '=',
    9114
  )
) 

那么,有没有可能限制绝对路径的结果呢?有很多方法,但要复杂得多。使用搜索作为基础还可以实现更好的扩展。