1

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

我怎样才能做到这一点?

4

1 回答 1

1

这可以通过 group-by 子句来实现。这类似于 SQL group by,但具有更精细的控制级别。

在下面的代码中,未装箱$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 ] }
于 2017-10-30T07:17:55.343 回答