jsoniq - функция empty() для определения наличия атрибута
Я использую try.zorba.io Мой код (упрощенный):
jsoniq version "1.0";
let $tweets :=
[
{
"id" : 1,
"user" : {
"id" : 1111,
"screen_name" : "Bobby"
}
},
{
"id" : 2,
"user" : {
"id" : 1111,
"screen_name" : "Bobby"
}
},
{
"id" : 3,
"user" : {
"id" : 2222,
"screen_name" : "Greg"
}
},
{
"id" : 4,
"user" : {
"id" : 3333,
"screen_name" : "Tom"
}
}
]
let $users :=
[
{
"screen_name" : "Julie",
"id" : 4444
}, {
"screen_name" : "Tom",
"id" : 3333
}, {
"screen_name" : "Greg",
"id" : 2222
}, {
"screen_name" : "Barb",
"id" : 5555
}, {
"screen_name" : "Bobby",
"id" : 1111
}, {
"screen_name" : "Yall",
"id" : 6666
}
]
Я пытаюсь выяснить "screen_name"
из всех $users
у кого нет $tweets
, Я думаю, что я должен использовать empty(s)
функционировать как-то, но я не знаю как. Вот мои усилия до сих пор (но это не работает, мой результат пуст):
for $t in members($tweets)
for $u in members($users)
for $r in members($users)
where $u."id" eq $t."user"."id"
where empty($r)
return $u."screen_name"
Любой совет?
1 ответ
Вам нужен вложенный цикл, чтобы вычислять твиты для каждого пользователя и связывать их с переменной. Как только эти твиты сохранены в переменной, вы можете отфильтровать с помощью empty
функция, вот так (проверено на try.zorba.io):
...
for $u in members($users)
let $tweets :=
for $t in members($tweets)
where $u."id" eq $t."user"."id"
return $t
where empty($tweets)
return $u."screen_name"
Обратите внимание, что try.zorba.io
в настоящее время работает на Zorba 2.9, которая является более старой версией. Стабильная, зрелая версия JSONiq поставляется с последней версией Zorba 3.0, которую вы можете скачать.
С Zorba 3.0 запрос может быть улучшен следующим образом:
...
let $tweeting-user-ids := distinct-values($tweets[].user.id)
for $user in $users[]
where not $user.id = $tweeting-user-ids
return $user.screen_name