如何更新嵌入式文件?

时间:2013-06-16 12:43:28

标签: document insert-update rethinkdb

如何将第二条评论的文字更新为“新内容”

{
  name: 'Me',
  comments: [{
        "author": "Joe S.",
        "text": "I'm Thirsty"
    },
    {
        "author": "Adder K.",
        "text":  "old content"
    }]
}

2 个答案:

答案 0 :(得分:13)

更新嵌入式阵列基本上包括两个步骤:

1。 您创建整个阵列的修改版本。您可以使用多种操作来修改数组,这些操作列在此处:http://www.rethinkdb.com/api/#js:document_manipulation-insert_at

在您的示例中,如果您知道要更新的文档是数组的第二个元素,那么您可以编写类似

的内容
oldArray.changeAt(1, oldArray.nth(1).merge({text: "new content"}))

生成新数组。 1这里是第二个元素的索引,因为索引从0开始。如果您不知道索引,可以使用indexesOf函数来搜索数组中的特定条目。这里发生了多件事: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)

答案 1 :(得分:1)

Daniel的解决方案是正确的。但是,Github上有几个未解决的计划增强问题,包括:

......以及其他相关问题。在将这些引入ReQL(特别是#895)之前,Daniel的方法是正确的。