2016-11-03 18 views
2

現在、ArangoDBが今後の代替案になるかどうかを評価中です。今回の評価の一環として、現在のNoSQL dbとArangoDBを話すコードを交渉するコードを移植しています。これまでのところかなりスムーズな乗り心地でしたが、サブ文書を更新する方法を頭に入れておくのは驚くほど困難でした。私はアトミックnum_soldを高めるために、今、それを達成したいと思い何ArangoDBサブ文書の更新

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

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

:私たちはこのような何かを持っていると仮定すると。

非常に最初の単純なアプローチは次のように何かをしようとすることはもちろんでした:

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

を(そこにコピーペースター用スポイラー警告:上に移動このコードは、ちょうどあなたの人生を惨めになります。)

これは明らかにうまくいかず、複数の理由が考えられます。 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" 
] 
関連する問題