У меня есть эти карты (они были построены из другого запроса):
let $my_maps :=
(
map {
"book_id": "id_1",
"title": "Some title",
"author": "Some author",
"date": "Some dates"
},
map {
"book_id": "id_2",
"title": "Some title",
"author": "Some author",
"date": "Some dates"
}
)
И у меня есть этот файл XML:
<book xml:id = "id_1">
<introduction>texte of introduction</introduction>
<chapter id = "1">texte of chapter 1</chapter>
<chapter id = "2">texte of chapter 2</chapter>
<notes>texte of notes</notes>
<conculsion>texte of conclusion</conculsion>
</book>
Что я хочу:
introduction
и notes
)Мой текущий XQuery:
let $grouped_map :=
(
for $id in $my_maps?book_id
for $book_part in collection("path_to_my_collection")/book[@xml:id = $id]//(introduction | notes)
return
map:merge((
$my_maps[?book_id = $id],
for $part in $book_part
group by $xml_id := $part/ancestor::book/@xml:id
return
map:entry("text", $part)
))
)
return
$grouped_map
Текущий результат:
1
map {
"book_id": "id_1",
"title": "Some title",
"author": "Some author",
"date": "Some dates",
"text": <introduction>texte of introduction</introduction>
}
2
map {
"book_id": "id_1",
"title": "Some title",
"author": "Some author",
"date": "Some dates",
"text": <notes>texte of notes</notes>
}
Ожидаемый результат:
1
map {
"book_id": "id_1",
"title": "Some title",
"author": "Some author",
"date": "Some dates",
"text": (<introduction>texte of introduction</introduction>, <notes>texte of notes</notes>)
}
Я также пробовал map {'duplicates' : 'combine'}
:
let $grouped_map :=
(
for $id in $my_maps?book_id
for $book_part in collection("path_to_my_collection")/book[@xml:id = $id]//(introduction | notes)
return
map:merge((
$my_maps[?book_id = $id],
map:entry("text", $book_part),
map {'duplicates' : 'combine'}
))
)
return
$grouped_map
Но результат остается прежним. (Кстати, я пользуюсь eXsit и не видел в его документации о функциях карты ни одного упоминания о map {'duplicates' : 'combine'}
, так что не уверен, что они разрешают это...)
Для меня это не имеет особого значения, я просто хочу сгруппировать весь «текст» по id. Встречный вопрос: если предположить, что у меня могут быть сотни карт, и в моем окончательном отчете я хочу построить некоторый вывод xml из этих карт, что лучше всего подходит для производительности запроса? Иметь одну карту с сотнями вложенных карт или иметь сотни «маленьких» карт?
Я мало что знаю о exists-db, поэтому не буду делать никаких предположений о производительности.
Мне кажется, что ты просто хочешь
for $map in $my_maps
let $books := collection("path_to_my_collection")/book[@xml:id = $map?book_id]
return map:put($map, 'text', $books ! (.//introduction | .//notes))
Это поместит элемент text
в каждую карту ввода, значение может быть пустой последовательностью, если нет подходящих книг.
Отлично работает! Большое спасибо!
Вы начинаете с последовательности карт и хотите получить последовательность карт в результате? Или одна карта?