【问题标题】:Marklogic/XQuery - Results to be sorted then limited to most recentMarklogic/XQuery - 对结果进行排序,然后限制为最近的
【发布时间】:2018-07-18 06:56:28
【问题描述】:

在 MarkLogic 中,我尝试过以下代码。但是,我希望有一个程序可以按年、月、日排序,然后限制结果。下面的代码对结果进行了限制,然后按YY、MM、DD排序,返回了错误的结果。

xquery version "1.0-ml";

declare variable $query := 
cts:and-query
  ((
      cts:element-word-query(xs:QName("journal-title"),"MyJournal"),
      cts:element-word-query(xs:QName("subject"),"MyNews")));

declare function local:do-query(){
  element xml {
    for $i in cts:uris( (), ("limit=50"), $query)
    let $item := doc($i)
    order by ($item//pub-date/year) descending, ($item//pub-date/month) descending, ($item//pub-date/day) descending

  return
      element article {
        element journal-title { $item//journal-title },
        element sub {$item//article-meta//article-categories//subj-group[@subj-group-type="content-type"]//subject},
        element title { $item//article-title },
        element byline { $item//contrib/string-name },
        element body { $item//body },
      element images {
       for $graphic in $item//body//graphic
          return element image { ($graphic//@*[name()="xlink:href"]/data()) }},
        element year {$item//pub-date/year/string()},
        element month {$item//pub-date/month/string()},
        element day {$item//pub-date/day/string()},
        element doi { $item//article-id[@pub-id-type="doi"]/text() },
        element doitrim {substring-after($item//article-id[@pub-id-type="doi"]/text(),"/")}
    }
  }
};

local:do-query()

提前致谢。

【问题讨论】:

    标签: xml xquery marklogic


    【解决方案1】:

    您的代码正在选择与查询条件匹配的前 50 个 URI,加载这些文档并对其进行排序。

    听起来好像您要搜索符合查询条件的文档,结果按年、月、日值排序,然后从该排序集中选择前 50 个。

    您可以使用cts:search() 搜索与您的查询条件匹配的文档,并使用cts:index-order() 条件和cts:element-reference() 的序列来返回按年、月和日排序的结果,然后使用谓词限制为这些排序文档的前 50 个。

    xquery version "1.0-ml";
    declare variable $query := 
                       cts:and-query((
                         cts:element-word-query(xs:QName("journal-title"),"MyJournal"),
                         cts:element-word-query(xs:QName("subject"),"MyNews")
                       ));
    
    declare function local:do-query() {
      element xml {
        for $item in cts:search(fn:doc(), $query,
                      ("unfiltered",
                       (
                        cts:index-order(cts:element-reference(xs:QName("year")), "descending"),
                        cts:index-order(cts:element-reference(xs:QName("month")), "descending"),
                        cts:index-order(cts:element-reference(xs:QName("day")), "descending")
                       ) 
                      ) 
                    )[1 to 50]
        return
          element article {
            base-uri(),
            element journal-title { $item//journal-title },
            element sub {$item//article-meta//article-categories//subj-group[@subj-group-type="content-type"]//subject},
            element title { $item//article-title },
            element byline { $item//contrib/string-name },
            element body { $item//body },
          element images {
    
           for $graphic in $item//body//graphic
              return element image { ($graphic//@*[name()="xlink:href"]/data()) }},
            element year {$item//pub-date/year/string()},
            element month {$item//pub-date/month/string()},
            element day {$item//pub-date/day/string()},
            element doi { $item//article-id[@pub-id-type="doi"]/text() },
            element doitrim {substring-after($item//article-id[@pub-id-type="doi"]/text(),"/")}
        }
      }    
    };  
    
    local:do-query()
    

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多