2013-05-16 1 views
0

Нужно что-то вроде этого в Marklogic с помощью xquery. Получите документ, присутствующий в местоположении, если нет, создайте документ, используя xdmp:document-insert(), а затем извлеките документ с помощью fn:doc().Marklogic: Вставить и извлечь документ с использованием xquery в том же запуске

В первом запуске документа нет. Поэтому он создает документ, но ничего не получает. Во втором запуске извлекается документ, созданный в первом запуске. Но я хочу сделать то же самое.

Я знаю, что здесь отсутствует что-то простое. Это одно дело с одной транзакцией? Оба оператора находятся в отдельных строках, поэтому не уверен, что это один случай транзакции.

declare function lk:createXmlIfNotPresent(){ 
     let $xml_dir := "app/test" 
     let $xml_full_path := "app/test/test.xml" 
     let $dir_uri := cts:uri-match($xml_dir) 
     let $dir_creation := 
     if(fn:empty($xml_dir)) then (
      xdmp:directory-create($xml_dir) 
     )else() 
     let $exists := fn:doc-available($xml_full_path) 
     let $xml_creation := 
     if($exists eq fn:false()) then (
     xdmp:document-insert($xml_full_path,<root></root>,xdmp:default- permissions()) 
     )else() 
     return fn:doc($xml_full_path) 
    }; 
+0

Вы можете обойти транзакционную суету здесь, просто вернув , если он не существует, а не используется fn: doc .. – grtjn

+0

Я хочу, чтобы документ был написан в ML @grtjn. Я бы использовал этот xml в других функциях в одном и том же xquery – NitZRobotKoder

+0

Вы все равно можете это сделать, пока вы передаете результат этой функции, вместо использования fn: doc всюду. – grtjn

ответ

3

Да, это связано с транзакциями. Весь корпус программы XQuery по умолчанию работает в одной транзакции. В отличие от RDBMS сделок, в ML сделка скрывает что это делает. Ваше представление о базе данных остается без изменений в течение всей транзакции. Изменения завершаются и отображаются только после завершения программы.

Вы можете работать с этим различными способами, я предлагаю этот учебник.

https://docs.marklogic.com/guide/app-dev/transactions

0

Если вы хотите сделать то же самое запустите, используйте функцию xdmp: eval() для создания своего документа.

1

Хотя советы о сделках справедливо в общем случае, этот случай может быть обработан просто.

У вас уже есть документ в памяти (< корень/> в примере) в качестве второго параметра для xdmp:document-insert().

Вы можете присвоить документ переменной. Передайте документ xdmp:document-insert(), а также верните документ.