2017-10-28 107 views
1

我想用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

這可以通過分組子句來實現。這可以像SQL組一樣工作,但具有更好的控制級別。

在下面的代碼中,拆箱$tweets陣列中的四個對象根據其語言字段($tweet.metadata.iso_language_code)進行分組。在返回子句的每次評估中,分組變量$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) } 
] 

上有回報子句中的表達沒有限制:$language$tweet就像任何其他變量,它們可以被用來作爲輸入到任何JSONiq表達式。例如,代替計算推文,也可以將它們嵌套在輸出中,因爲數據模型是樹狀的:

return { language: $language, count: [ $tweet ] }