Marklogic 9 中的奇怪 xdmp.eval() toObject() 问题
strange xdmp.eval() toObject() issue in Marklogic 9
所以我遇到了以下问题,我需要更新 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
按预期返回成员数组,但是
// 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
但是返回的对象找不到成员数组...
现在怎么办?
xdmp.eval()
正在返回 1 document-node()
个对象的序列。
当您在该序列上调用 .toObject()
时,它被转换为一个包含一个 document-node()
的数组,然后 [0]
是 selecting document-node()
.
然后您可以使用 .toObject()
将文档节点转换为 JavaScript 对象:
var prjObj = xdmp.eval('cts.doc("' + pUri + '")',null,options).toObject()[0].toObject()
或者,您可以使用 fn.head()
select 结果序列中的第一项,然后将 document-node()
转换为 JavaScript 对象
var prjObj = fn.head(xdmp.eval('cts.doc("' + pUri + '")',null,options)).toObject()
然后你可以使用prjObj.members
来寻址成员数组。
所以我遇到了以下问题,我需要更新 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
按预期返回成员数组,但是
// 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
但是返回的对象找不到成员数组...
现在怎么办?
xdmp.eval()
正在返回 1 document-node()
个对象的序列。
当您在该序列上调用 .toObject()
时,它被转换为一个包含一个 document-node()
的数组,然后 [0]
是 selecting document-node()
.
然后您可以使用 .toObject()
将文档节点转换为 JavaScript 对象:
var prjObj = xdmp.eval('cts.doc("' + pUri + '")',null,options).toObject()[0].toObject()
或者,您可以使用 fn.head()
select 结果序列中的第一项,然后将 document-node()
转换为 JavaScript 对象
var prjObj = fn.head(xdmp.eval('cts.doc("' + pUri + '")',null,options)).toObject()
然后你可以使用prjObj.members
来寻址成员数组。