2017-08-28 71 views
2

我想从ArangoDB中的文档中删除一个属性。如何永久取消ArangoDB文档的属性?

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

例子:

let target_key = "42" 

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

该示例返回原始文档没有属性myAttribute,但新版本不保存到数据库,如此看来,这只是一个预计的副本。

回答

1

或者,你可以设置你要删除到null的属性和使用keepNull选项:

在文档中明确 null
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 

属性被保留。仅触摸WITH后指定的属性。

注:如果您解释查询,你会看到nullMeansRemove: true写的查询选项代替keepNull: false

+0

嘿,感谢您的意见,我不知道这种方式。 “OPTIONS {keepNull:false}”在文档中如何用'null'处理其他属性?假设我想删除一个属性,但想保留其他属性,即使它们是“null”。另一个问题可能是:没有“空值”的(缺点)优点是什么? –

+1

正如我所提到的,其他属性将保持不变,即使它们是* null *。只有'myAttribute'将被上面的查询删除,因为它是唯一提供的属性:'WITH {myAttribute:null}'。一般而言,您可能会或可能不会在您的文档中存储空值,这取决于您需要表达的内容。在大多数情况下,我假设你可以简单地删除一个属性,如果它是未使用的。如果您需要区分值不可用与实际为空,则在后一种情况下存储空值是合法的。 – CoDEmanX

+0

非常好。谢谢,我现在看到你明确提到它。你认为哪种方法更好?或者,您认为我应该将哪个答案标记为“已接受的答案”? –

1

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

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

let target_key = "42" 

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

此示例返回新的文档,其中myAttributeUNSET被保存到收藏与REPLACE去除。

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

我读了this issue之后就想通了。我觉得这是一件太简单的任务,但我希望这对于追随我的人有用。