Pregunta

El nuevo PG HStar se ve increíble

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

¿Pero parece que no es compatible con incrementos atómicamente como MongoDB?

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

¿Cómo hacer esto con PostgreSQL HStore?

¿Fue útil?

Solución

MongoDB necesita un $inc operador porque:

  1. Las operaciones atómicas en MongoDB son difíciles sin soporte específico de bajo nivel.
  2. La interfaz no es lo suficientemente rica como para expresar c = c + 1 sin un operador especial.

Solo necesitas expresar c = c + 1 con hartes h. Esta tarea es un poco complicada porque las tiendas H usan cadenas tanto para las claves como para los valores y eso te deja con un desastre de casting. Creo que estás atrapado con algo desagradable como esto:

update t
set h = h || hstore('my_counter', ((h -> 'my_counter')::integer + 1)::text)
where mykey = myval

los (h -> 'my_counter')::integer + 1 ¿El incremento extrae el valor (h -> 'my_counter'), lanzarlo a un entero y agregarle uno. Luego construyes un solo elemento HSTORE con hstore('my_counter', ...) y un explícito ::text Ejecute el valor para asegurarse de que PostgreSQL sepa qué función desea. Finalmente, concatena el nuevo valor clave en la tienda H-H store original con h || hstore(...) para reemplazar el valor anterior.

Si no desea usar ese desastre algo desagradable todo el tiempo, entonces podría envolverlo una función simple y decir:

update t
set h = hstore_inc(h, 'my_counter', 1)
where ...

para ocultar la maldad.

Estoy seguro de que hay otras formas de hacerlo (usando los diversos a/desde la matriz Funciones tal vez) pero lo anterior debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top