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

时间:2017-11-09 21:55:40

标签: json xquery marklogic

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

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

任何想法如何使用cts查询来完成?

由于

4 个答案:

答案 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")
)))