我想用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" }]我怎样才能做到这一点?
发布于 2017-10-30 07:17:55
这可以通过一个组-by子句来实现。这类似于SQL组by,但具有更好的控制级别。
在下面的代码中,未装箱的$tweets数组中的四个对象根据它们的语言字段($tweet.metadata.iso_language_code)进行分组。在每个返回子句的计算中,分组变量$language将包含当前组的语言名称,而非分组变量$tweet将包含属于该组的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) }
]返回子句中的表达式没有限制:$language和$tweet和其他变量一样,可以用作任何JSONiq表达式的输入。例如,与其计算tweet,还可以将其嵌套在输出中,因为数据模型是树形的:
return { language: $language, count: [ $tweet ] }https://stackoverflow.com/questions/46991454
复制相似问题