【问题标题】:Rethinkdb removing data from documentsRethinkdb 从文档中删除数据
【发布时间】:2013-07-23 20:45:56
【问题描述】:

我正在尝试从具有给定相当简单结构的文档中删除一些数据部分,随着项目的进行,这将变得比这更深更重:

{
    id: "...",
    name: "...",
    phone: "...",
    data: {
        key1: "val1",
        ...
    }
    ...
}

我知道除了用更新的树替换整个树之外,没有其他方法可以从嵌套部分更新/删除部分。

例如,如果我想从文档数据中删除 key1,我需要使用不包含 key1 的副本更新文档数据部分

document.update({data: new dict without key1})

有没有更简单的方法可以从文档的根目录中删除一部分(如名称字段)而不用不包含名称键和值的自身副本更新整个文档?每次我需要删除部分数据时,我是否必须深度复制和过滤文档?

【问题讨论】:

    标签: nosql rethinkdb document-store


    【解决方案1】:

    以下是从文档根目录中删除键的查询:

    r.table('foo').get(document_id).replace(r.row.without('key'))
    

    您也可以对多个文档进行如下操作:

    r.table('foo').filter(condition).replace(r.row.without('key'))
    

    在即将发布的 1.8 版本中,您还可以对嵌套键执行以下操作:

    r.table('foo').get(document_id).replace(r.row.without({data: { key1: true}}))
    

    目前,上面的命令本质上是用自己的副本替换文档,而服务器上没有相关键。在接下来的几个版本中,这将进行大量优化,以最大限度地减少内存中的文档复制(因此,虽然看起来您正在用没有密钥的自身副本替换文档,但在引擎盖下,该操作将在没有任何复制的情况下破坏性地执行) .未来的版本可能会更新底层结构,以便不必将完整文档写入磁盘。

    如果您使用without 命令,您无需执行任何操作即可利用这些优化(除了升级服务器)。

    希望这会有所帮助。

    【讨论】:

    • 谢谢斯拉瓦。我急切地等待下一个版本,rethinkdb 到目前为止很漂亮。
    • hm r.table("cv").get("e1a8b71f-ba52-4fd4-8c3a-e981df1e3108").update(r.row.without("name")) 返回“不变: 1",文档仍然有名称字段。我正在使用 1.7.3 ubuntu 版本
    • 抱歉,请使用update 代替replace。我应该知道最好不要在凌晨 4 点发布答案 :) 我会更新帖子。
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多