【问题标题】:How to permanently unset an attribute of ArangoDB document?如何永久取消设置 ArangoDB 文档的属性?
【发布时间】:2017-08-28 14:29:33
【问题描述】:

我想从 ArangoDB 中的文档中删除一个属性。

我认为正确的方法是使用函数UNSET(doc, attributeName1, ..., attributeNameN)。但是,仅此一项,数据库中没有任何变化。

例子:

let target_key = "42"

FOR doc IN myCollection
    FILTER doc._key == target_key
    RETURN UNSET(doc, "myAttribute")

示例返回原始文档没有属性myAttribute,但是新版本没有保存到数据库中,所以看起来这只是一个投影副本.

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    或者,您可以将要删除的属性设置为 null 并使用 keepNull 选项:

    LET target_key = "42"
    
    FOR doc IN myCollection
        FILTER doc._key == target_key
        UPDATE doc WITH { myAttribute: null } IN myCollection
        OPTIONS { keepNull: false }
        RETURN NEW
    

    保留文档中具有显式null 值的属性。只有 WITH 之后指定的属性才会被触及。

    注意:如果您解释查询,您将在 Write query options 下看到 nullMeansRemove: true 而不是 keepNull: false

    【讨论】:

    • 嘿,感谢您的输入,我不知道这种方式。 OPTIONS { keepNull: false }如何对待文档中带有null的其他属性?假设我想删除一个属性,但想保留其他属性,即使它们是null。另一个问题可能是:没有null-values 的(不利)优势是什么?
    • 正如我所提到的,其他属性将保持不变,即使它们是 null。只有myAttribute 会被上述查询删除,因为它是唯一提供的属性:WITH { myAttribute: null }。通常,您可能会或可能不会在文档中存储空值,这取决于您需要表达的内容。在大多数情况下,我假设您可以简单地删除未使用的属性。如果您需要区分不可用的值与实际为空的值,则在后一种情况下存储空值是合法的。
    • 优秀。谢谢,我现在看到您明确提到了它。你认为哪种方法更好?或者,您认为我应该将哪个答案标记为“已接受的答案”?
    • 这并没有真正的区别,新的文档修订版是以任何一种方式编写的。 REPLACE 似乎更简洁一些。但是,如果您要删除的属性嵌套更深,那么UPDATE MERGE_RECURSIVE(doc, { a: { b: { c: { targetKey: null } } } }) IN myCollection OPTIONS { keepNull: false } 是要走的路。我对REPLACE 进行了同样的尝试,但它不支持keepNull
    【解决方案2】:

    对此的简单答案是将UNSETREPLACE 函数结合使用。

    UNSET 作用于单个文档中的属性,REPLACE 作用于集合中的整个文档。

    let target_key = "42"
    
    FOR doc IN myCollection
        FILTER doc._key == target_key
        REPLACE UNSET(doc, "myAttribute") IN myCollection
        RETURN NEW
    

    此示例返回使用UNSET 删除myAttribute 的新文档,该文档使用REPLACE 保存到集合中。

    NEWOLD 关键字可以与 UPDATEUPSERT 一样使用。

    我在阅读this issue 后发现了这一点。我觉得这是一项太简单的任务,无法坚持,但我希望这对我之后的人有用。

    【讨论】:

    • New in Return New 未被识别,我删除了 Return 语句并且工作正常。感谢您节省了我几个小时的生命。
    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 2017-01-07
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多