Marklogic 在托管文档上使用 xPath 会生成该文档的所有版本
Marklogic using xPath on managed documents results in all versions of this documents
在托管 (dls:document-insert-and-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
在检索文档时导致 2 或 none 个元素,具体取决于实际用户的权限
xquery version "1.0-ml";
<queryresult>
<byxPath>{
for $i in //smtextdocuments[id=9114]
return (<uri>{fn:base-uri($i)}</uri>,$i)
}
</byxPath>
</queryresult>
您正在使用 DLS 并行存储文档的多个版本,因此如果您查询整个数据库(如果您使用像 //xxx
这样的绝对路径会发生这种情况),您将获得所有该文档的匹配版本。
我建议改用 cts:search
, for instance in combination with the dls:documents-query()
。如果您还为 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
)
)
HTH!
在托管 (dls:document-insert-and-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
在检索文档时导致 2 或 none 个元素,具体取决于实际用户的权限
xquery version "1.0-ml";
<queryresult>
<byxPath>{
for $i in //smtextdocuments[id=9114]
return (<uri>{fn:base-uri($i)}</uri>,$i)
}
</byxPath>
</queryresult>
您正在使用 DLS 并行存储文档的多个版本,因此如果您查询整个数据库(如果您使用像 //xxx
这样的绝对路径会发生这种情况),您将获得所有该文档的匹配版本。
我建议改用 cts:search
, for instance in combination with the dls:documents-query()
。如果您还为 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
)
)
HTH!