使用cts查询来检索与给定文档uri-Marklogic关联的集合



我需要在Marklogic中检索给定文档所属的集合。我知道xdmp命令可以做到这一点。但我需要在cts查询中使用它来检索数据,然后从中过滤记录

xdmp:document-get-collections("uri of document") can't be run inside cts-query to give appropriate data.

知道如何使用cts查询吗?

感谢

脑海中浮现出几个选项:

选项一:使用cts:values()

cts:values(cts:collection-reference())

如果您查看文档,您会发现您还可以通过将查询作为参数之一传递来将其限制为某些片段。

**更新:[11-2017]附加的评论要求将cts:values()的结果限制在单个文档中(出于实际目的,我会说fragment==document)

cts:values的文档对此进行了解释。它是第四个参数-一个限制结果的查询。了解这个模式,因为它是MarkLogic的许多功能的一部分。是你的朋友。我将为这个问题语句使用的查询是cts:document-query();

示例:

cts:values(
cts:collection-reference(), 
(), 
(), 
cts:document-query('/path/to/my/document')
)

完整示例:

cts:search(
collection(),
cts:collection-query(
cts:values(
cts:collection-reference(), 
(), 
(), 
cts:document-query('/path/to/my/document')
)
)
)[1 to 10]

选项二:使用cts:collection-match()
需要对从文档中仅返回部分集合进行更多控制,然后使用cts:colection-match()。与第一个选项一样,您可以将结果限制为一些片段。然而,它的好处是可以选择一种模式。


注意:
它们都返回一个序列,非常适合输入查询的其他部分。然而,在引擎盖下,我相信它们的工作方式不同。第二个选项是针对词典运行。唯一集合名称列表越大,模式匹配越复杂,解析时间就越长。我在项目中使用集合匹配。然而,当我可以通过将结果限制在较少的文档数量来限制可能的选择时,我通常会使用它。

您不能一步到位。您必须首先运行代码才能检索与文档关联的集合。您可以使用类似xdmp:document-get集合之类的东西。然后,您必须将其输入到动态构建的cts查询中:

let $doc-collections := xdmp:document-get-collections($doc-uri)
return
cts:search(collection(), cts:collection-query($doc-collections))[1 to 10]

啊!

您正在寻找cts:collection-query()吗?

将两个XML文件插入同一集合:

xquery version "1.0-ml";
xdmp:document-insert("/a.xml", <root><sub1><a>aaa</a></sub1></root>,
map:map() => map:with("collections", ("coll1")));
xdmp:document-insert("/b.xml", <root><sub2><a>aaa</a></sub2></root>,
map:map() => map:with("collections", ("coll1")));

搜索收藏:

xquery version "1.0-ml";
let $myColl:= xdmp:document-get-collections("/a.xml")
return 
cts:search(/root,
cts:and-query((cts:collection-query($myColl),cts:element-query(xs:QName("a"),"aaa")
)))

最新更新