JSONiq计算数组中的重复项

时间:2017-10-28 15:38:49

标签: json jsoniq

我想用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" }]

我怎样才能实现这个目标?

1 个答案:

答案 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) }

此外,不需要metadataiso_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 ] }