Xquery 在marklogic 8中对多个映射进行排序

Xquery 在marklogic 8中对多个映射进行排序,xquery,marklogic,marklogic-8,Xquery,Marklogic,Marklogic 8,这更像是一个XQuery而不是MarkLogic。我有三个map:map,每个map都有“id”和score的键值对。我想根据每个地图的分数对所有不同的ID进行排序。 例如: 在上面的示例中,每个映射都是id:score for key value(不知道如何在这里表示:) 我想要根据分数从三张地图中排序的id列表 是否有一种好的方法或更好的方法来进行排序,或者我必须合并映射的键并迭代键序列并对它们进行排序?这似乎是折叠的一个很好的用例。它是Xquery 3.0规范的一部分 可以遍历一系列项,并

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

在上面的示例中,每个映射都是id:score for key value(不知道如何在这里表示:)

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


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

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

可以遍历一系列项,并在每个项遍历时获取其结果。在本例中,$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
  )

你在寻找地图上的一个综合分数吗?如果是,当同一关键点多次出现时(如关键点1、2),您会使用多少分数?如果关键点在地图上冲突。。我想选择最高分。。。在上面的示例中,map1中的1将用于排序。请发布预期输出,给出这些示例地图数据。我也做了类似的操作,我联合所有地图,并对地图执行排序。。但这是同样的想法
   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
  )