доступ к объекту в массиве объектов в jsoniq - PullRequest
0 голосов
/ 12 сентября 2018

Впервые в JSONIQ, и с помощью zorba я пока что хочу извлечь некоторую информацию из индексированного объекта в массиве объектов в JSONIQ. Вот код на данный момент.

    jsoniq version "1.0";
    let $bstore:={
    "bookstore":
    {
        "book":[
            {
                "category":"cooking",
                "title":"Everyday Italian",
                "author":"Giada De Laurentiis",
                "year":"2005",
                "price":"30.00"
            },
            {
                "category":"web",
                "title":"XQuery Kick Start",
                "author":["James McGovern","Per Bothner","Kurt Cagle","James Linn","Vaidyanathan Nagarajan"],
                "year":"2003",
                "price":"49.99"
            }
        ]
    }
}
for $o in $bstore.bookstore
let $a:=$o.book
return $a.title

Я пытаюсь вернуть название, автора и цену книг. Я могу вернуть массив, но всякий раз, когда я набираю индекс.

let $a:=$o.book[1].title
return $a

Я не получил результатов. Мой ожидаемый результат будет

Everyday Italian

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Поиск в массиве в JSONiq выполняется с помощью двойных квадратных скобок, например:

let $a:=$o.book[[1]].title
return $a

Обратите внимание, что страница try.zorba.io основана на более ранней версии Zorba (2.9), котораяне поддерживает последнюю версию JSONiq (в какой-то момент она должна быть обновлена).В этой более ранней версии поиск в массиве выполнялся с перегрузкой синтаксиса вызова функции:

let $a:=$o.book(1).title
return $a

Если вы хотите использовать стабильную версию JSONiq с ее современным синтаксисом, вы можете загрузить Zorba 3.0 ивыполнять запросы локально.

Семантика [] с простыми квадратными скобками заключается в том, что он фильтрует последовательность, либо с позицией, либо с булевым фильтром, например:

(1, 2, 3, 4)[2]

возвращает2.

Массив отличается от последовательности.Массив можно рассматривать как «коробочную» последовательность, т. Е. (1, 2, 3, 4) - это последовательность из четырех элементов, а [1, 2, 3, 4] - это последовательность только из одного элемента: массив, содержащий вложенные 1, 2, 3 и 4.

Вы можете преобразовать массив в последовательность с $o.book[], если необходимо ($o.book() с Zorba 2.9).И вы можете «обернуть» последовательность обратно в массив с помощью [ $sequence ].Это немного похоже на открытие или закрытие блока.

Рекурсивно вкладывать могут только массивы, например, [ [1, 2], [3, 4]] имеет два уровня вложенности, точно так же, как и в случае массивов JSON.Последовательности, однако, не являются вложенными, т. Е. ((1, 2), (3, 4) совпадает с плоской последовательностью (1, 2, 3, 4) с нулевыми уровнями вложенности.Последовательности элементов являются основными пользователями JSONiq и совместимы с потоковым исполнением (например, фильтрация последовательности миллионов объектов без фактической ее материализации).

0 голосов
/ 12 сентября 2018

Сначала я планировал выполнить итерацию по массиву объектов, чтобы распечатать данные внутри объектов.Что касается JSONIQ, я обнаружил, что мне нужно заключить в скобки имя массива, в данном случае это book ().

Мой код, приведенный ниже, должен повторяться, название, автор и цена книги.

jsoniq version "1.0";
let $bstore:={
    "bookstore":
    {
        "book":[
            {
                "category":"cooking",
                "title":"Everyday Italian",
                "author":"Giada De Laurentiis",
                "year":"2005",
                "price":"30.00"
            },
            {
                "category":"web",
                "title":"XQuery Kick Start",
                "author":["James McGovern","Per Bothner","Kurt Cagle","James Linn","Vaidyanathan Nagarajan"],
                "year":"2003",
                "price":"49.99"
            }
        ]
    }
}
for $o in $bstore.bookstore.book()
return 
{
"title":$o.title,
"author":$o.author,
"price":$o.price
}

Код можно протестировать на Zorba .

Вывод будет таким, как показано ниже:

{ "title" : "Everyday Italian", "author" : "Giada De Laurentiis", "price" : "30.00" }{ "title" : "XQuery Kick Start", "author" : [ "James McGovern", "Per Bothner", "Kurt Cagle", "James Linn", "Vaidyanathan Nagarajan" ], "price" : "49.99" }
...