【问题标题】:Read documents in order按顺序阅读文件
【发布时间】:2021-02-05 10:25:09
【问题描述】:

我们有一个 URI 列表,我们需要按照传递的顺序读取它。

示例 1

doc(("/doc1", "/doc2", "/doc3"))

上面的函数应该返回“/doc1”的内容,然后是“/doc2”,然后是“/doc3”,但它没有发生。

下面的查询也发生了同样的事情。

示例2

cts:search(doc(), cts:document-query((("/doc1"),("/doc2"),("/doc3"))))

如果我想按照传递 URI 的顺序读取文档,解决方案是什么?

任何帮助表示赞赏..!

【问题讨论】:

    标签: xquery marklogic marklogic-10


    【解决方案1】:

    cts:search 有自己的排序功能,您可以使用cts:index-order 等函数触发。 fn:doc 接受一个数组,并按数据库顺序返回它们。它们听起来都不像您想要实现的目标。

    我建议明确地迭代 uris,并逐个获取 uris。您可以为此使用 ! 运算符,例如:

    ("/doc1", "/doc2", "/doc3") ! doc(.)
    

    HTH!

    【讨论】:

      【解决方案2】:

      @grtjn 的答案是正确的,但您可以将其减少为一个数据库查询,然后按照您想要的顺序返回文档,例如

      let $uris := ("/doc2", "/doc1", "/doc3")
      
      let $docs := map:new(
        fn:doc($uris) ! map:entry(xdmp:node-uri(.), .)
      )
      
      for $i in $uris
      return map:get($docs, $i)
      

      【讨论】:

      • 或者查询可以使用光学 API 进行排序,如 op.fromLexicons({uri: cts.uriReference()}, null, op.fragmentIdCol('docId')) .where( op.gt(op.col('uri'), lastUriInPreviousPage)) .orderBy('uri') .limit(256) .joinDoc('doc', 'docId') .result();
      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 2020-03-11
      • 2014-02-12
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多