我需要在Marklogic中检索给定文档所属的集合。 我知道xdmp命令可以做到这一点。但我需要在cts查询中使用它来检索数据,然后从中过滤记录。
xdmp:document-get-collections("uri of document") can't be run inside cts-query to give appropriate data.
任何想法如何使用cts查询来完成?
由于
答案 0 :(得分:3)
我想到了一些选择:
选项一:使用cts:values()
cts:values(cts:collection-reference())
如果您查看文档,您将看到通过将查询作为参数之一传递,您也可以将其限制为某些片段。
**更新:[11-10-2017] 附带的评论要求提供一个将cts:values()的结果限制为单个文档的示例(出于实际目的,我会说片段==文档)
cts:values的文档解释了这一点。这是第4个参数 - 限制结果的查询。了解这种模式,因为它是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()。与第一个选项一样,您可以将结果限制为仅一些片段。但是,它具有模式选项的好处。
注意:
它们都返回一个序列 - 非常适合输入查询的其他部分。然而,在幕后,我相信他们的工作方式不同。第二个选项是针对词典运行的。唯一集合名称列表越大,模式匹配越复杂,解析时间越长。我在项目中使用集合匹配。但是,当我可以通过将结果限制为较少数量的文档来限制可能的选择时,我通常会使用它。
答案 1 :(得分:2)
您无法一步完成此操作。您必须首先运行代码才能检索与文档关联的集合。你可以使用像xdmp:document-get-collections这样的东西。然后,您必须将其提供给您动态构建的cts查询:
let $doc-collections := xdmp:document-get-collections($doc-uri)
return
cts:search(collection(), cts:collection-query($doc-collections))[1 to 10]
HTH!
答案 2 :(得分:1)
您在寻找cts:collection-query()吗?
答案 3 :(得分:0)
将两个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")
)))