使用MarkLogic Patch Builder在JSON数组的末尾插入一个新数组项

时间:2017-10-16 20:23:59

标签: arrays json node.js marklogic

我的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简单化为数组。

提前致谢!

1 个答案:

答案 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));