Извлечение данных JSON с помощью JSONiq - PullRequest
1 голос
/ 29 октября 2019

Позвольте мне быть этими двумя простыми файлами JSON

      jsoniq version "1.0";

    let $tweets := 
    { 
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_reutlingen"
    }
    }

    let $users := 
    {
    { "screen_name": "ifp_tuebingen"
    },
    { "screen_name": "ifp_reutlingen"
    }

}

Я хочу написать запрос JSONiq, который определяет для каждого пользователя, сколько твитов у него есть на основе его screen_name, ожидаемый результат для этого примера:

{ "2" : "ifp_tuebingen" }{ "1" : "ifp_reutlingen" }

Я написал следующий код

for $u in $users
let $counter := 0
for $t in $tweets
where $u.screen_name eq $t.screen_name
let $counter := $counter+1
return {$counter : $u.screen_name}

вместо него выводится следующий вывод

{ "1" : "ifp_tuebingen" }{ "1" : "ifp_tuebingen" }{ "1" : "ifp_reutlingen" }

1 Ответ

0 голосов
/ 29 октября 2019

JSONiq является декларативным языком, что означает, что он может группировать и считать автоматически, в отличие от императивных языков, в которых нужно вручную увеличивать счетчик:

let $tweets := (
  { "screen_name": "ifp_tuebingen" },
  { "screen_name": "ifp_tuebingen" },
  { "screen_name": "ifp_reutlingen" }
)
return
for $t in $tweets
group by $screen-name := $t.screen_name
let $count := count($t)
return { $count : $screen-name }

В целом, было бы более распространенной практикой иметьподсчет в качестве значения и отображаемое имя в качестве ключа в результатах, т. е. swap $count и $u.screen_name:

...
return { $screen-name : $count }

JSONiq может затем собрать эти результаты в один объект, так какимена экранов после группировки будут уникальными клавишами:

...
return
{|
  for $t in $tweets
  group by $screen-name := $t.screen_name
  let $count := count($t)
  return { $screen-name : $count }
|}

Обратите внимание, что в этом случае данные $users не нужны. Это понадобится только в том случае, если у пользователей есть дополнительные метаданные, и в этом случае можно выполнить объединение.

...