在marklogic 8中对多个地图进行排序

Sorting multiple maps in marklogic 8

与 MarkLogic 相比,它更像是一个 XQuery。我有三个 map:map,每个地图都有 "id" 和分数的键值对。我想根据每个地图的分数对所有不同的 ID 进行排序。 例如:

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

在上面的例子中,每个map都是id:score键值(不知道这里怎么表示:))..

我想要根据分数从三个地图中排序的 id 列表..

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

这似乎是一个很好的折叠用例。它是 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
  )