Я создал конечную точку 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 выполняется в режиме одной транзакции, это приводит к конфликтующим обновлениям.
Есть ли способ избежать этого? Есть ли лучший способ обработки данных из одного файла?
Спасибо.