在marklogic 8

时间:2016-05-03 15:05:44

标签: xquery marklogic marklogic-8

这更像是一个XQuery而不是MarkLogic。我有三张地图:地图和每张地图都有“id”和得分的键值对。我想根据每张地图的分数对所有不同的ID进行排序。 例如:

map1 : 1:2048, 5:2000
map2 : 2:5000, 1:1000, 4:3000
map3 : 6:100, 7:5000, 2:2000

在上面的例子中,每个地图都是id:键值得分(不知道如何在这里表示:))..

我希望根据得分从三张地图中排序的id列表。

有没有更好的方法或更好的方法进行排序,还是我必须联合地图的键并迭代键序列并对它们进行排序?

1 个答案:

答案 0 :(得分:3)

这似乎是折叠的一个很好的用例。它是Xquery 3.0规范的一部分。

Folding可以浏览一系列项目,并在每个项目完成后获取结果。在这个例子中,$ combinedMaps是最后一次调用的结果,$ mapToMerge是它当前正在经历的序列中的项目。

这是一个你想要做的事情的例子。

   declare function local:sortMaps(
  $newMap as map:map,
  $mapA as map:map,
  $mapB as map:map
) as map:map {
  let $build :=
    for $key in map:keys($mapA)
    let $otherMapValue :=
      (map:get($mapB, $key), 0)[1]
    let $value := map:get($mapA, $key)
    return 
      if ($value gt $otherMapValue) then (
        map:put($newMap, $key, $value)
      ) else (
        map:put($newMap, $key, $otherMapValue)
      )
  return $newMap
};

let $map1 := 
  map:new((
    map:entry("1",2048),
    map:entry("5",2000)
  ))

let $map2 := 
  map:new((
    map:entry("2",5000),
    map:entry("1",1000),
    map:entry("4",3000)
  ))

let $map3 := 
  map:new((
    map:entry("6",100),
    map:entry("7",5000),
    map:entry("2",2000)
  ))

let $maps := ($map1, $map2, $map3)
return
  fn:fold-left(
    function($combinedMaps, $mapToMerge) {
      let $newMap := map:map()
      let $newMap := local:sortMaps($newMap, $combinedMaps, $mapToMerge)
      let $newMap := local:sortMaps($newMap, $mapToMerge, $combinedMaps)
      return $newMap
    }, 
    $maps[1], 
    $maps
  )