首页 > 解决方案 > 使用 MarkLogic 进行计数

问题描述

我是 MarkLogic 领域的初学者,需要帮助来解决这个问题并澄清一下。这是 xml 类的示例。我需要一个函数来计算学生参加的课程数量,使用地图

<Classes>
   <Class>
      <Class-name>math</Class-name>
      <Student-name>Jon</Student-name>
      <Student-name>Sam</Student-name>
   </Class>
   <Class>
     <Class-name>Sciences</Class-name>
     <Student-name>Jon</Student-name>
     <Student-name>Jack</Student-name>
     <Student-name>Nay</Student-name>
   </Class>
   <Class>
     <Class-name>Languages</Class-name>
     <Student-name>Jon</Student-name>
     <Student-name>Sam</Student-name>
     <Student-name>Nay</Student-name>
   </Class>
</Classes>

标签: nosqlmarklogicxquery-sql

解决方案


一种不使用地图进行计数的方法是收集 的不同列表Student-name,然后使用这些名称来获取Student-name具有这些名称的元素的计数:

for $student in fn:distinct-values($Classes/Class/Student-name)
return 
  $student||":"||count($Classes/Class[Student-name=$student])

使用地图实现相同目的的一种方法是遍历每个Student-name元素,在地图中放置一个条目,将当前计数增加 1:

let $stats := map:new()
let $_ := 
  for $student in $Classes/Class/Student-name
  return map:put($stats, $student, 1 + (map:get($stats, $student), 0)[1])
return
  map:keys($stats) ! ( .||":"||map:get($stats, .) )

推荐阅读