Карты XQuery: добавьте значение с тем же ключом к существующей карте

У меня есть эти карты (они были построены из другого запроса):

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>

Что я хочу:

  • извлечь из моего XML-файла только несколько частей (для этого примера, скажем, introduction и notes)
  • добавьте эти части (с ключом «текст») из файла XML к существующей карте с соответствующим значением идентификатора.

Мой текущий 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'}, так что не уверен, что они разрешают это...)

Вы начинаете с последовательности карт и хотите получить последовательность карт в результате? Или одна карта?

Martin Honnen 10.12.2020 17:44

Для меня это не имеет особого значения, я просто хочу сгруппировать весь «текст» по id. Встречный вопрос: если предположить, что у меня могут быть сотни карт, и в моем окончательном отчете я хочу построить некоторый вывод xml из этих карт, что лучше всего подходит для производительности запроса? Иметь одну карту с сотнями вложенных карт или иметь сотни «маленьких» карт?

ag_1812 10.12.2020 17:56

Я мало что знаю о exists-db, поэтому не буду делать никаких предположений о производительности.

Martin Honnen 10.12.2020 18:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
419
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне кажется, что ты просто хочешь

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 в каждую карту ввода, значение может быть пустой последовательностью, если нет подходящих книг.

Отлично работает! Большое спасибо!

ag_1812 10.12.2020 20:29

Другие вопросы по теме