javascript - Marklogic 9 中奇怪的 xdmp.eval() toObject() 问题
问题描述
所以我有以下问题,我需要更新 JSON 文档中的数组。它是一个捕获项目设置的文档,项目成员可以读取项目文档但不能更新它。
我需要先阅读文档,但这是一个不同的事务,提取members
数组并继续。
现在我从xdmp.eval()
找不到数组返回的JSON对象,直接从cts.doc()
does ...?
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()
document-node()
正在返回 1 个对象的序列。
当您调用.toObject()
该序列时,它会转换为带有 one 的数组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
来寻址成员数组。
推荐阅读
- automation - 如何在赛普拉斯的页面上声明临时文本?
- r - R:对几列应用 xts 函数
- python - 简化 mongodb pymongo 查询
- npm - 为什么 `npm pack` 从我的库中删除文件?
- google-analytics - Google Analytics 4:如何获取全局对象的名称(gtag)
- google-cloud-platform - 如何锁定到公共和私有部分的路由,这在 GCP 负载均衡器后面
- tinymce - 如何更改 tinyMCE 编辑器值以仅返回 html 元素
- azure-devops - 如何在其中一台匹配的服务器中运行部署组作业?
- c# - 通过 TableAdapters 使用 MySQL 链接数据集时导致并发冲突的原因是什么?
- string - Kotlin - 如何从多行字符串中修剪所有前导空格?