2017-10-28 2 views
1

Ich möchte doppelte Werte mit JSONiq zählen. Ich habe folgenden Code:JSONiq Anzahl Duplikate im Array

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] 

Dies gibt alle Sprachen zurück, aber es öffnet ein neues Paar für jede Sprache. Es sieht wie folgt aus:

[ { "name" : "de" }, 
     { "name" : "da" }, 
     { "name" : "da" }, 
     { "name" : "da" }] 

Ich möchte ein JSON-Objekt zurückzugeben, das wie folgt aussieht:

[ { "count" : 1, "language" : "de" }, 
     { "count" : 3, "language" : "da" }] 

Wie kann ich das erreichen?

Antwort

1

Dies kann mit einer Gruppenklausel erreicht werden. Dies funktioniert wie eine SQL-Gruppe von, aber mit einem noch feineren Maß an Kontrolle.

Im folgenden Code sind die vier Objekte im Array ohne Rahmen $tweets nach ihrem Sprachfeld gruppiert ($tweet.metadata.iso_language_code). In jeder Auswertung der Rückgabe-Klausel enthält die Gruppierungsvariable $language den Namen der Sprache für die aktuelle Gruppe, und die Nicht-Gruppierungsvariable $tweet enthält die Sequenz der Tweets, die zu der Gruppe gehören. Der Aufruf von count() für diese Sequenz ergibt 3 bzw. 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) } 

Auch die Zitate auf metadata und iso_language_code nicht benötigt werden. Bei Bedarf können Sie auch das Ergebnis in einem Array wickeln, etwa so:

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

Es gibt keine Beschränkung der Ausdruck in der return-Klausel: $language und $tweet sind Variablen, wie alle anderen, und sie können als Eingänge verwendet werden zu einem beliebigen JSONiq-Ausdruck. Anstatt die Tweets zu zählen, kann man sie beispielsweise auch in der Ausgabe verschachteln, da das Datenmodell baumartig ist:

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