我的MarkLogic数据库中有一个cities.json
文件,如下所示:
[
{ city: "New York", pop: "8.538 million (2016)"},
{ city: "Miami", pop: "453,579 (2016)"}
]
在Node.js中使用MarkLogic Patch Builder,我想在数组的末尾附加一个城市项目。
db.documents.patch('cities.json',
pb.insert('array-node("/")', 'last-child', { city: "Denver", pop: 682,545 (2015) })
).result();
但是,这似乎不会更新cities.json
文件。
我也尝试过:
pb.insert('/array-node()', 'last-child', { city: "Denver", pop: 682,545 (2015) })
pb.insert('/array-node("/")', 'last-child', { city: "Denver", pop: 682,545 (2015) })
但没有运气。
我一直在阅读本手册(https://docs.marklogic.com/guide/node-dev/partial-update#id_65749),并尝试使用array-node()
来选择父阵列。我注意到手册中提供的所有示例都要求数组具有属性名称。没有示例如何选择作为JSON的父元素的数组。
请注意,如果我将cities.json
文件更改为:
{
"cities": [
{ city: "New York", pop: "8.538 million (2016)"},
{ city: "Miami", pop: "453,579 (2016)"}
]
}
和Patch Builder声明:
pb.insert('/array-node("cities")', 'last-child', { city: "Denver", pop: 682,545 (2015) })
它按预期工作,但我真的更喜欢将我的JSON简单化为数组。
提前致谢!
答案 0 :(得分:2)
在幕后,Node.js客户端API使用MarkLogic REST API,如果您点击其文档,您将在limitations working with JSON documents找到一个部分。
在本节中,解释了在“匿名”root属性之后立即插入属性是不可能的。 (这将是一个JSON文档,其中没有命名的root属性)。
目前您最好的选择是检索文档,在JavaScript代码中执行更新并重新插入文档。这可以通过以下方式实现:
const uri = '/cities.json';
db.documents.read(uri).result()
.then(response => {
const document = response[0].content;
document.push({ city: 'Denver', pop: '682,545 (2015)' });
return db.documents.write({ uri, content: document }).result();
})
.then(response => console.info(response))
.catch(error => console.error(error));