Question

Nouveau pg hstore a l'air génial

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

Mais il semble ne pas soutenir l'incrément atomiquement comme MongoDB?

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

Comment faire cela avec PostgreSQL HSTORE?

Était-ce utile?

La solution

MongoDB a besoin d'un $inc opérateur parce que:

  1. Les opérations atomiques dans MongoDB sont difficiles sans support spécifique de bas niveau.
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top