Получение XDMP-CONFLICTINGUPDATES при вставке документов из цикла for - PullRequest
0 голосов
/ 30 октября 2018

Я создал конечную точку REST, которая получает записи из одного файла JSON и вставляет / обновляет каждый элемент при его анализе.

{
  "records" : [
  {
    "description" : "test",
    "createDate" : "20181018 125816.220",      
    "owner" : "Smith, Bob",
    "uniqueID" : "REF-12-3456",      
    "status" : "Draft",
    "title" : "test record for Bob"
  },
  {
    "description" : "test 3",
    "createDate" : "20181018 125816.220",      
    "owner" : "Jones, Ben",
    "uniqueID" : "REF-12-7890",      
    "status" : "Draft",
    "title" : "test record for Ben"
  },
  {
    "description" : "test",
    "createDate" : "20181018 125816.220",      
    "owner" : "Smith, Bob",
    "uniqueID" : "REF-12-3456",      
    "status" : "Complete",
    "title" : "Completed test record for Bob"
  },
 ]
}

Моя конечная точка отправляет JSON в функцию, которая анализирует каждый элемент, создает URI из поля uniqueID, отправляет каждый узел в функцию для добавления узла метаданных и вставки документа.

declare function local:doc-from-web($doc as document-node()*)
{
  let $message :=
    for $item in $doc/managementOfChange
     let $uri := $item/uniqueID
     let $loaded :=  local:load-doc($kms,$uri)
     return $loaded  
  return $message
};

declare function local:load-doc(
  $doc as object-node(),
  $uri as xs:string
)
{
  let $metadata := json:object()
  let $_ := map:put($metadata, "commonDate", $doc/createDate)
  let $_ := map:put($metadata, "commonStatus", $doc/status[1])        
  let $_ := map:put($metadata, "ingestDate", fn:current-dateTime())

  let $metadataJson := xdmp:to-json($metadata)

  let $object := json:object()
  let $_ :=  map:put($object,"RECORD",$doc)
  let $_ :=  map:put($object,"metadata", $metadataJson)

  let $newDoc := xdmp:to-json($object) 

  let $insert := xdmp:document-insert(
    $uri,
    $newDoc,
      ( xdmp:permission("rest-reader", "read"),
        xdmp:permission("rest-writer", "update") ),
      ("collection1","collection2")
  )

return “Document Inserted”
};

Поскольку в загружаемом файле JSON могут быть обновленные версии одной и той же записи (см. Узлы 1 и 3 в моем примере данных), а цикл for выполняется в режиме одной транзакции, это приводит к конфликтующим обновлениям.

Есть ли способ избежать этого? Есть ли лучший способ обработки данных из одного файла?

Спасибо.

...