2016-01-12 11 views

Odpowiedz

6

Prawdopodobnie będziesz musiał użyć xdmp:eval, która przyjmuje argument opcji, a tam można określić bazę danych:

xdmp:eval("cts:search(...)", (), 
    <options xmlns="xdmp:eval"> 
    <database>{xdmp:database("otherdb")}</database> 
    </options>) 
+1

Jest to nie tylko dobra odpowiedź, ale to chyba jedyny słuszny. Jedynymi opcjami określania typu zapytania DB, o którym mi wiadomo, są: 'xdmp: rodzina eval', rodzina' xdmp: invoke' i 'xdmp: spawn'. – CtheGood

2

Chociaż na najniższym poziomie, xdmp: eval jest naprawdę to, co się dzieje, najbardziej czystą opcją, która jest prawdopodobnie najłatwiejsza do napisania w linii, jest xdmp:invoke-function - a jeszcze lepiej może być użycie anonimowej funkcji w niej. Ta kombinacja pozwala na naturalne wykorzystanie istniejących zmiennych. Jeśli chcesz pójść dalej, spójrz także na xdmp: zastosuj (aby zwiększyć elastyczność)

Ponadto w MarkLogic 8 dostępny jest nowy typ transakcji o nazwie update-auto-commit który również sprawia, że ​​jest przyjemny i czyść, aby wywołać funkcję inline, czekając na wyniki (bez odradzania się) i mieć ją w swojej własnej transakcji. Użyty poprawnie, wyniki aktualizacji/wstawienia są nawet dostępne w kodzie wywołującym.

Próbka kod poniżej stosuje CTS: szukanie przeciwko innej bazy danych i naturalnie wykorzystuje zmienne w głównym kodzie:

xquery version "1.0-ml"; 
declare namespace html = "http://www.w3.org/1999/xhtml"; 

let $query := cts:word-query("foo") 
let $start := 1 
let $end := 3 
let $database-name := "your-other-database-name-here" 

return 
    xdmp:invoke-function(
     function() { 
      cts:search(doc(), $query)[$start to $end]   
     }, 
     <options xmlns="xdmp:eval"> 
     <database>{xdmp:database($database-name)}</database> 
     </options>) 
Powiązane problemy