MongoDB ha bisogno di un $inc
operatore perché:
- Le operazioni atomiche in MongoDB sono difficili senza un supporto specifico di basso livello.
- L'interfaccia non è abbastanza ricca da esprimere
c = c + 1
senza un operatore speciale.
Devi solo esprimere c = c + 1
con hstores. Questo compito è un po 'complicato perché gli hstores usano stringhe sia per le chiavi che per i valori e questo ti lascia con un disastro di casting. Penso che tu sia bloccato con qualcosa di cattivo come questo:
update t
set h = h || hstore('my_counter', ((h -> 'my_counter')::integer + 1)::text)
where mykey = myval
Il (h -> 'my_counter')::integer + 1
L'incremento estrae il valore (h -> 'my_counter'
), lanciarlo a un numero intero e aggiungerne uno. Quindi costruisci un singolo elemento Hstore con hstore('my_counter', ...)
e un esplicito ::text
Cast sul valore per assicurarti che PostgreSQL sappia quale funzione desideri. Infine, concateni il nuovo valore chiave sull'Hstore originale con h || hstore(...)
Per sostituire il vecchio valore.
Se non vuoi usare quel casino in qualche modo brutto, potresti avvolgerlo una semplice funzione e dire:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
per nascondere la cattiveria.
Sono sicuro che ci sono altri modi per farlo (usando i vari da/da array funzioni forse) ma quanto sopra dovrebbe funzionare.