странная проблема xdmp.eval () toObject () в Marklogic 9 - PullRequest
0 голосов
/ 20 января 2019

Итак, у меня следующая проблема, мне нужно обновить массив в документе JSON. Это документ, который фиксирует настройки проекта, участники проекта могут читать документ проекта, но не обновлять его.

Мне нужно сначала прочитать документ, но это другая транзакция, извлечь массив members и продолжить.

Теперь объект JSON, который я получаю от xdmp.eval(), не может найти массив, объект JSON непосредственно из cts.doc() делает ...?

Пример документа проекта по адресу uri '/projects/12345.json':

{
"name": "project01",
"description": "example project", 
"id": "12345", 
"members": [
{
"name": "user01", 
"role": "owner", 
"uid": "234"
}, 
{
"name": "user02", 
"role": "member", 
"uid": "123"
}
] 
}

Мой запрос JavaScript:

var pid = 12345;
// uri to project doc
var pUri = '/projects/' + pid + '.json'

// alternative to not lock project doc
var options = {
             "isolation" : "different-transaction"
              }

//var prjObj = xdmp.eval('cts.doc("' + pUri + '")',null,options).toObject()[0]
//var prjObj = xdmp.eval('cts.doc("' + pUri + '").toObject()',null,options)
var prjObj = cts.doc(pUri).toObject()

prjObj.members

возвращает массив членов, как и ожидалось, но

// cast eval result to object
var prjObj = xdmp.eval('cts.doc("' + pUri + '")',null,options).toObject()[0]
// cast doc to object inside eval
var prjObj = xdmp.eval('cts.doc("' + pUri + '").toObject()',null,options);
// end code

Но возвращаемые объекты не могут найти массив членов ...

что теперь?

1 Ответ

0 голосов
/ 21 января 2019

xdmp.eval() возвращает последовательность из 1 document-node() объектов.

Когда вы вызываете .toObject() для этой последовательности, она преобразуется в массив с одним document-node(), а затем [0] выбирает это document-node().

Затем вы можете использовать .toObject() для преобразования узла документа в объект JavaScript:

var prjObj = xdmp.eval('cts.doc("' + pUri + '")',null,options).toObject()[0].toObject()

В качестве альтернативы вы можете выбрать первый элемент из последовательности результатов, используя fn.head(), а затем преобразовать этот document-node() в объект JavaScript

var prjObj = fn.head(xdmp.eval('cts.doc("' + pUri + '")',null,options)).toObject()

и затем вы можете использовать prjObj.members для адресации массива членов.

...