2012-05-11 4 views
4

У меня есть XML-документ, подобный этому.Получить отличный результат в сервере marklogic

<Authors> 
     <Author> 
     <name>R.N Tagore</name> 
     <book>Gitanjli</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Panch Parameshvar</book> 
     </Author> 
     <Author> 
     <name>H.R Bacchan</name> 
     <book>Madhushala</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Gaban</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Nirmala</book> 
     </Author> 
     <Author> 
     <name>Premchand</name> 
     <book>Nirmala</book> 
     </Author> 
    </Authors> 

Из вышеприведенного XML мне нужен отдельный список имени автора.
Для этого я могу написать запрос, как,

fn:distinct-values(cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(()))) 

Что выше код будет делать это, он получит результат имени авторов, а затем Fn: отчетливое-значение() функции будет фильтровать отчетливое Имя автора из этого результирующий набор. Для текущего сценария будет работать нормально, так как данные в XML только 6, но когда данные очень высоки скажем 50 Лак

cts:search(fn:doc()//pa:Author/pa:name,cts:and-query(())) 

выше часть запроса даст XDMP-EXPNTREECACHEFULL исключения, потому что мы пытаемся cache 50 lac в памяти.
Для этого необходимо указать только свое имя автора, используя cts: search или search: search API. Я не хочу сначала получать набор результатов, а затем извлекать отдельную запись из этого набора результатов, используя fn: distinct-values ​​().

ответ

2

Вы можете сделать это быстро на большой набор данных, установив индекс диапазона на name. После этого используйте cts:values().

cts:values(cts:element-reference(xs:QName("name"))) 

Этот код предполагает, что вы используете стандартную настройку для индекса.

Обратите внимание, что если у вас есть общее имя элемента, например «имя», вы можете использовать указатель пути, чтобы быть более точным. В этом случае, вы можете создать индекс пробежит по автору/названию, то

cts:values(cts:path-reference(xs:QName("Author/name"))) 

(Я предполагаю, что вы используете MarkLogic 7+, если нет, то вы можете использовать cts:element-values() вместо карат: значения ().)

Смежные вопросы