【问题标题】:Using cts query to retrieve collections associated with the given document uri- Marklogic使用 cts 查询检索与给定文档 uri-Marklogic 关联的集合
【发布时间】:2017-11-09 21:55:39
【问题描述】:

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

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

知道如何使用 cts 查询来完成吗?

谢谢

【问题讨论】:

    标签: json xquery marklogic


    【解决方案1】:

    想到几个选项:

    选项一:使用cts:values()

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

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

    **更新:[11-10-2017] 附带的评论要求提供将 cts:values() 的结果限制为单个文档的示例(出于实际目的,我会说片段 == 文档)

    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()。与第一个选项一样,您可以将结果限制为仅一些片段。但是,它的好处是可以选择模式。


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

    【讨论】:

    • 感谢大卫的回复。我仍然无法弄清楚如何使用集合引用来获取与文档关联的集合(使用它的 doument uri,如 xdmp:document-get-collection)。使用 cts:collection-match() 我可以过滤掉那些我明白了。如果可能,您能否提供示例查询。谢谢
    • 亲爱的用户,名字叫 user1575601,我更新了 cts:values 的示例,以检索单个文档的所有集合。
    【解决方案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!

    【讨论】:

    • Geert,可以通过提供 cts:collection-match 或 cts:values 的结果作为 cts:collection-query 的输入,在单个查询中执行此操作。
    • 这不是真正的一步。它会针对索引进行两轮解析。
    • 啊..好点。现在我很感兴趣..去(离线)测试各种场景,看看是否有任何性能差异。
    【解决方案3】:

    你在找cts:collection-query()吗?

    【讨论】:

    • cts:collection-query 检索在该集合中关联的文档。我正在寻找反之亦然,获取文档集合。
    【解决方案4】:

    将两个 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")
    )))
    

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多