MongoDB braucht a $inc
Bediener, weil:
- Atomare Operationen in MongoDB sind ohne spezifische Unterstützung auf niedriger Ebene schwierig.
- Die Schnittstelle ist nicht reich genug, um auszudrücken
c = c + 1
Ohne einen besonderen Betreiber.
Sie müssen nur ausdrücken c = c + 1
mit hstores. Diese Aufgabe ist ein wenig kompliziert, da HStores Saiten sowohl für die Schlüssel als auch für die Werte verwenden und Sie ein Chaos des Gießens hinterlassen. Ich denke, Sie sind mit etwas Böses wie folgt festgefahren:
update t
set h = h || hstore('my_counter', ((h -> 'my_counter')::integer + 1)::text)
where mykey = myval
Das (h -> 'my_counter')::integer + 1
Hat das Inkrement, indem der Wert extrahiert wird (h -> 'my_counter'
), wirft es an eine Ganzzahl und füge ihm einen hinzu. Dann bauen Sie ein einzelnes Element mit hstore('my_counter', ...)
und ein explizites ::text
Geben Sie den Wert auf, um sicherzustellen, dass PostgreSQL weiß, welche Funktion Sie möchten. Schließlich verkettet Sie den neuen Schlüsselwert auf die ursprüngliche HSTore mit h || hstore(...)
den alten Wert ersetzen.
Wenn Sie dieses etwas böse Chaos nicht die ganze Zeit verwenden möchten, können Sie ihm eine einfache Funktion einwickeln und sagen:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
die Bosheit zu verbergen.
Ich bin sicher, es gibt andere Möglichkeiten, dies zu tun (mit den verschiedenen Verwenden nach/from Array Funktionen vielleicht), aber die oben genannte sollte funktionieren.