【问题标题】:How to update embedded document?如何更新嵌入文档?
【发布时间】:2013-06-12 13:50:54
【问题描述】:

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

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

【问题讨论】:

    标签: document insert-update rethinkdb


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      更新嵌入数组基本上涉及两个步骤:

      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。 现在我们可以构造新对象,我们仍然必须将它实际存储在原始行中。为此,我们使用更新并将“cmets”字段设置为新数组。我们可以通过 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)
      

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 2014-06-12
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 2011-10-25
        • 2020-06-07
        相关资源
        最近更新 更多