2016-11-03 27 views
2

Ich werte gerade aus, ob ArangoDB eine zukünftige Alternative für uns sein kann. Als Teil dieser Evaluierung portiere ich Code, der mit unserer aktuellen NoSQL-Datenbank kommuniziert, in Code, der ArangoDB spricht. Während es bisher eine ziemlich reibungslose Fahrt war, habe ich erstaunlich schwierig, wie ich Subdokumente aktualisieren soll. Angenommen, wir haben so etwas wie dieses:Aktualisierung ArangoDB Subdokument

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

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

Was möchte ich jetzt zu erreichen, es atomar num_sold zu erhöhen.

Ein erster naiver Ansatz war natürlich etwas Ähnliches versuchen:

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

(Spoiler-Warnung für den Kopie-Pasters da draußen.. Gehen Dieses Ausschnitt wird nur das Leben schwer machen)

Dies hat offensichtlich nicht funktioniert und wahrscheinlich aus mehr als einem Grund. Arango scheint nicht zu mögen, dass ich das Attribut mit Punktnotation referenziere, das Attribut, das mit einer Zahl ("0") beginnt, könnte ebenfalls ein Problem sein usw. Während ich ein Beispiel gefunden habe here schien es ein wenig kompliziert und kompliziert für das, was ich bin versuchen zu tun. Es gibt auch eine andere Diskussion here, die nahe ist, was ich gerne tun würde. Die vorgeschlagene Lösung in dieser Diskussion verwendet jedoch das Schlüsselwort OLD, das in meinem Fall einen Fehler erzeugt, sowie den Code, der alle Schlüssel in "0" ersetzt.

1) Was ist der beste Weg, um num_sold atomar zu erhöhen?

2) Wann ist eine Operation atomar? (Versuchen Sie, Transaktionen so lange wie möglich zu vermeiden)

3) Wann kann die Punktnotation verwendet werden und wann kann sie nicht verwendet werden?

4) Kann ich Parameter an ein Attribut binden? Zum Beispiel lassen einige @attributesubdoc.0.num_sold sein?

Danke!

Antwort

1

ArangoDB kann die Abfrage nicht analysieren, wenn Sie Zahlen in der Punktnotation verwenden. Aber es gibt einen einfachen Weg - verwenden Sie einfach Klammern anstelle der Punktnotation, wie Sie es taten.

Beispiel - nicht funktioniert:

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) 

Beispiel - fixed:

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

[ 
    "abc" 
] 

Bindevariablen Verwendung - nicht funktioniert:

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) 

Bindevariablen Verwendung - fixed:

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

[ 
    "abc" 
]