JSONiq 计算数组中的重复项
JSONiq count duplicates in array
我想用 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]
这 return 包含所有语言,但它会为每种语言打开一个新的对。它看起来像这样:
[ { "name" : "de" },
{ "name" : "da" },
{ "name" : "da" },
{ "name" : "da" }]
我想要 return 一个看起来像这样的 JSON 对象:
[ { "count" : 1, "language" : "de" },
{ "count" : 3, "language" : "da" }]
我怎样才能做到这一点?
这可以通过 group-by 子句来实现。这类似于 SQL 分组依据,但具有更精细的控制级别。
在下面的代码中,未装箱的 $tweets
数组中的四个对象根据其语言字段 ($tweet.metadata.iso_language_code
) 进行了分组。在 return 子句的每个评估中,分组变量 $language
将包含当前组的语言名称,非分组变量 $tweet
将包含推文序列属于团体。在此序列上调用 count()
将分别 return 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 ] }
我想用 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]
这 return 包含所有语言,但它会为每种语言打开一个新的对。它看起来像这样:
[ { "name" : "de" },
{ "name" : "da" },
{ "name" : "da" },
{ "name" : "da" }]
我想要 return 一个看起来像这样的 JSON 对象:
[ { "count" : 1, "language" : "de" },
{ "count" : 3, "language" : "da" }]
我怎样才能做到这一点?
这可以通过 group-by 子句来实现。这类似于 SQL 分组依据,但具有更精细的控制级别。
在下面的代码中,未装箱的 $tweets
数组中的四个对象根据其语言字段 ($tweet.metadata.iso_language_code
) 进行了分组。在 return 子句的每个评估中,分组变量 $language
将包含当前组的语言名称,非分组变量 $tweet
将包含推文序列属于团体。在此序列上调用 count()
将分别 return 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 ] }