首页 > 解决方案 > 使用 JSONiq 获取 JSON 数据

问题描述

让这两个简单的 JSON 文件

      jsoniq version "1.0";

    let $tweets := 
    { 
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_reutlingen"
    }
    }

    let $users := 
    {
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_reutlingen"
    }

}

我想编写一个 JSONiq 查询,根据他的 screen_name 为每个用户确定他有多少条推文,这个例子的预期输出是

{ "2" : "ifp_tuebingen" }{ "1" : "ifp_reutlingen" }

我写了以下代码

for $u in $users
let $counter := 0
for $t in $tweets
where $u.screen_name eq $t.screen_name
let $counter := $counter+1
return {$counter : $u.screen_name}

它会产生以下输出

{ "1" : "ifp_tuebingen" }{ "1" : "ifp_tuebingen" }{ "1" : "ifp_reutlingen" }

标签: jsondatabasenosqljsoniq

解决方案


JSONiq 是一种声明性语言,这意味着它可以自动分组和计数,这与必须手动增加计数器的命令式语言不同:

let $tweets := (
  { "screen_name": "ifp_tuebingen" },
  { "screen_name": "ifp_tuebingen" },
  { "screen_name": "ifp_reutlingen" }
)
return
for $t in $tweets
group by $screen-name := $t.screen_name
let $count := count($t)
return { $count : $screen-name }

通常,更常见的做法是将计数作为值,将屏幕名称作为结果中的键,即交换$count$u.screen_name

...
return { $screen-name : $count }

JSONiq 然后可以将这些结果重新组合成一个对象,因为分组后的屏幕名称将是唯一的键:

...
return
{|
  for $t in $tweets
  group by $screen-name := $t.screen_name
  let $count := count($t)
  return { $screen-name : $count }
|}

请注意,$users在这种情况下不需要数据。只有在用户中有额外的元数据时才需要它,在这种情况下可以进行连接。


推荐阅读