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

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