如何将第二条评论的文本更新为“新内容”
{
name: 'Me',
comments: [{
"author": "Joe S.",
"text": "I'm Thirsty"
},
{
"author": "Adder K.",
"text": "old content"
}]
}
如何将第二条评论的文本更新为“新内容”
{
name: 'Me',
comments: [{
"author": "Joe S.",
"text": "I'm Thirsty"
},
{
"author": "Adder K.",
"text": "old content"
}]
}
更新嵌入式数组基本上涉及两个步骤:
1. 您创建整个阵列的修改版本。您可以使用多种操作来修改数组,它们在此处列出:http ://www.rethinkdb.com/api/#js:document_manipulation-insert_at
在您的示例中,如果您知道要更新的文档是数组的第二个元素,则可以编写类似
oldArray.changeAt(1, oldArray.nth(1).merge({text: "new content"}))
生成新数组。这里的 1 是第二个元素的索引,因为索引从 0 开始。如果不知道索引,可以使用 indexOf 函数在数组中搜索特定条目。这里发生了多件事:changeAt 替换了数组的一个元素。这里,索引 1 处的元素被 oldArray.nth(1).merge({text: "new content"}) 的结果替换。在该值中,我们首先使用 oldArray.nth(1) 选择我们想要作为新元素基础的元素。这给了我们 JSON 对象
{
"author": "Adder K.",
"text": "old content"
}
通过使用合并,我们可以用新值替换该对象的文本字段。
2. 现在我们可以构造新对象了,我们仍然必须将它实际存储在原始行中。为此,我们使用 update 并将“comments”字段设置为新数组。我们可以通过 ReQL r.row 变量访问行中旧数组的值。总体而言,查询将如下所示:
r.table(...).get(...).update({
comments: r.row('comments').changeAt(1,
r.row('comments').nth(1).merge({text: "new content"}))
}).run(conn, callback)
丹尼尔的解决方案是正确的。但是,Github 上有几个未解决的问题,用于计划的增强,包括:
通用对象和数组修改(https://github.com/rethinkdb/rethinkdb/issues/895)
能够为合并和更新指定可选参数(https://github.com/rethinkdb/rethinkdb/issues/872)
能够为合并指定冲突解决函数(https://github.com/rethinkdb/rethinkdb/issues/873)
...在其他相关问题中。在将这些引入 ReQL(尤其是 #895)之前,Daniel 的方法是正确的。