MongoDB a besoin d'un $inc
opérateur parce que:
- Les opérations atomiques dans MongoDB sont difficiles sans support spécifique de bas niveau.
- L'interface n'est pas assez riche pour exprimer
c = c + 1
sans opérateur spécial.
Vous avez juste besoin d'exprimer c = c + 1
avec hstores. Cette tâche est un peu compliquée parce que HSTORES utilise des chaînes pour les clés et les valeurs et cela vous laisse un gâchis de casting. Je pense que vous êtes coincé avec quelque chose de méchant comme ceci:
update t
set h = h || hstore('my_counter', ((h -> 'my_counter')::integer + 1)::text)
where mykey = myval
La (h -> 'my_counter')::integer + 1
fait l'incrément en extrayant la valeur (h -> 'my_counter'
), le jetant sur un entier, et en y ajoutant un. Ensuite, vous construisez un seul élément hstore avec hstore('my_counter', ...)
et un explicite ::text
Placez la valeur pour vous assurer que PostgreSQL sait quelle fonction vous souhaitez. Enfin, vous concaténez la nouvelle valeur clé sur le hstore original avec h || hstore(...)
pour remplacer l'ancienne valeur.
Si vous ne voulez pas utiliser ce gâchis un peu méchant tout le temps, vous pourriez envelopper une fonction simple et dire:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
pour cacher la méchanceté.
Je suis sûr qu'il existe d'autres moyens de le faire (en utilisant les différents à / depuis le tableau Fonctions peut-être) mais ce qui précède devrait fonctionner.