json - 使用 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" }
解决方案
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
在这种情况下不需要数据。只有在用户中有额外的元数据时才需要它,在这种情况下可以进行连接。
推荐阅读
- amazon-web-services - AWS Cloudformation - 如何手动添加/删除导出?
- java - 如何循环播放我的 mediaPlayer 延迟而不让声音相互播放?
- java - 使用循环时出现 java.lang.reflect.InvocationTargetException
- javascript - 更新的密码未显示在本机反应的 Firebase 数据库中
- java - 无法在 Spring Boot 中使用 JDBC 身份验证创建安全连接
- c++ - 指针符号有什么问题
- ios - 通过 Firebase 从 Google 登录获取出生日期和性别
- c - 在 Visual Studio 代码中添加 C 外部库
- php - cURL 在本地工作;服务器上的连接被拒绝
- c++ - 如何创建显示存在递归的调用顺序的跟踪