我想用JSONiq计算重复值。我有以下代码:
jsoniq version "1.0";
import module namespace fetch = "http://zorba.io/modules/fetch";
let $tweets := parse-json(fetch:content("/tweets.json"))
let $users := parse-json(fetch:content("/users.json"))
return
let $different_languages :=
for $tweet in $tweets[]
return {
"name" : $tweet."metadata"."iso_language_code"
}
return [$different_languages]
这会返回所有语言,但会为每种语言打开一对新语言。它看起来像这样:
[ { "name" : "de" },
{ "name" : "da" },
{ "name" : "da" },
{ "name" : "da" }]
我想返回一个如下所示的JSON对象:
[ { "count" : 1, "language" : "de" },
{ "count" : 3, "language" : "da" }]
我怎样才能实现这个目标?
答案 0 :(得分:1)
这可以通过group-by子句来实现。这类似于一个SQL组,但具有更精细的控制级别。
在下面的代码中,未装箱的$tweets
数组中的四个对象根据其语言字段($tweet.metadata.iso_language_code
)进行分组。在return子句的每个评估中,分组变量$language
将包含当前组的语言名称,而非分组变量$tweet
将包含属于该组的推文序列。在此序列上调用count()
将分别返回3和1。
jsoniq version "1.0";
import module namespace fetch = "http://zorba.io/modules/fetch";
let $tweets := parse-json(fetch:content("/tweets.json"))
let $users := parse-json(fetch:content("/users.json"))
return
for $tweet in $tweets[]
group by $language := $tweet."metadata"."iso_language_code"
return { language: $language, count: count($tweet) }
此外,不需要metadata
和iso_language_code
上的引号。如果需要,您还可以将结果包装到数组中,如下所示:
jsoniq version "1.0";
import module namespace fetch = "http://zorba.io/modules/fetch";
let $tweets := parse-json(fetch:content("/tweets.json"))
let $users := parse-json(fetch:content("/users.json"))
return [
for $tweet in $tweets[]
group by $language := $tweet.metadata.iso_language_code
return { language: $language, count: count($tweet) }
]
对return子句中的表达式没有限制:$language
和$tweet
是与其他任何变量一样的变量,它们可以用作任何JSONiq表达式的输入。例如,不是计算推文,也可以将它们嵌套在输出中,因为数据模型是树状的:
return { language: $language, count: [ $tweet ] }