Jak mogę zmienić bazę danych, czy funkcja cts:search
działa programowo?MarkLogic 8 - XQuery - cts: search - Zmieniaj programowo programowo
W tej chwili jestem w konsoli zapytań.
Jak mogę zmienić bazę danych, czy funkcja cts:search
działa programowo?MarkLogic 8 - XQuery - cts: search - Zmieniaj programowo programowo
W tej chwili jestem w konsoli zapytań.
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>)
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>)
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