Domanda

New PG Hstore sembra fantastico

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

Ma sembra non supportare l'incremento atomicamente come MongoDB?

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

Come farlo con PostgreSQL Hstore?

È stato utile?

Soluzione

MongoDB ha bisogno di un $inc operatore perché:

  1. Le operazioni atomiche in MongoDB sono difficili senza un supporto specifico di basso livello.
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top