Frage

New Pg Hstore sieht fantastisch aus

http://www.postgresql.org/docs/devel/static/hstore.html

Aber es scheint, als würde es nicht atomar wie MongoDB inkrementiert?

db.mycoll.update({mykey: myval}, {my_counter: {$inc: 1}})

Wie mache ich das mit PostgreSQL HStore?

War es hilfreich?

Lösung

MongoDB braucht a $inc Bediener, weil:

  1. Atomare Operationen in MongoDB sind ohne spezifische Unterstützung auf niedriger Ebene schwierig.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top