Marklogic 9中奇怪的xdmp.eval()toObject()问题

时间:2019-01-20 20:41:44

标签: javascript marklogic

因此,我遇到以下问题,我需要更新JSON文档中的数组。这是一个捕获项目设置的文档,项目成员可以读取该项目文档,但不能更新它。

我需要先阅读文档,但这是另一回事,提取members数组并继续。

现在我从xdmp.eval()返回的JSON对象无法找到该数组,直接从cts.doc()返回的JSON对象可以...?

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

按预期方式返回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 :(得分:3)

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来访问成员数组。