2016-11-03 63 views
2

我目前正在評估ArangoDB是否可以成爲我們的未來選擇。作爲評估的一部分,我將與當前的NoSQL數據庫進行對話的代碼移植到代表ArangoDB的代碼中。雖然到目前爲止這一行程相當順利,但我如何更新子文件的難度令人驚訝。假設我們有這樣的事情:更新ArangoDB子文檔

{ 
    "_key": "12345", 
    "subdoc": { 
     "0": { 
      "num_sold": 6, 
      "other_attribute": "important" 

    }, 
     "1": { 
      "num_sold": 4, 
      "other_attribute": "important" 
    } 
    } 
} 

我現在想完成它以原子增加num_sold

一個非常第一幼稚的做法當然是嘗試類似於:

FOR d in @@collection 
    FILTER d._key == "12345" 
    UPDATE d WITH { subdoc.0.num_sold : subdoc.0.num_sold + 1 } IN @@collection 
RETURN d 

(劇透了複製pasters那裏:。移動在這個片段只會讓你的生活苦不堪言)

這顯然不起作用,最有可能的原因不止一個。 Arango似乎並不喜歡使用點符號引用屬性,但以數字(「0」)開頭的屬性也可能是一個問題等。雖然找到了一個示例here但它看起來既複雜又複雜,試圖去做。還有另一個討論here接近我想要做的。然而,在該討論中提出的解決方案使用關鍵字OLD,在我的情況下會產生一個錯誤,並且代碼會替換「0」中的所有鍵。

1)什麼是原子增加num_sold的最佳方式?

2)什麼時候操作原子? (儘量遠離交易儘可能長)

3)什麼時候可以使用點符號?何時不能使用?

4)我可以將參數綁定到屬性嗎?例如讓一些@attributesubdoc.0.num_sold

謝謝!

回答

1

如果您使用點符號中的數字,ArangoDB無法解析查詢。 但是,有一種簡單的方法 - 只需使用括號而不是點符號。

實施例 - 不工作:

db._query(` 
    LET testdoc = {subdoc: {"0": "abc"}} 
    RETURN testdoc.subdoc.0`) 

ArangoError 1501: syntax error, unexpected integer number, 
expecting identifier or bind parameter near '0' at 
position 1:60 (while parsing) 

示例 - 固定:

db._query(` 
    LET testdoc = {subdoc: {"0": "abc"}} 
    RETURN testdoc.subdoc.[0]`) 

[ 
    "abc" 
] 

使用綁定變量 - 不工作:

db._query(` 
    LET testdoc = {subdoc: {"0": "abc"}} 
    RETURN [email protected]`, {bv: 0}) 

ArangoError 1501: syntax error, unexpected integer number, 
expecting identifier or bind parameter near '0' at 
position 1:60 (while parsing) 

使用綁定變量 - 固定:

db._query(` 
    LET testdoc = {subdoc: {"0": "abc"}} 
    RETURN testdoc.subdoc.[@bv]`, {bv:0}) 

[ 
    "abc" 
]