Pergunta

Novo pg hstore parece incrível

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

Mas parece que não suporta incrementos atomicamente como o MongoDB?

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

Como fazer isso com o PostgreSql Hstore?

Foi útil?

Solução

MongoDB precisa de um $inc operador porque:

  1. As operações atômicas no MongoDB são difíceis sem suporte específico de baixo nível.
  2. A interface não é rica o suficiente para expressar c = c + 1 sem um operador especial.

Você só precisa expressar c = c + 1 com hstores. Essa tarefa é complicada um pouco porque as hstores usam strings para as chaves e valores e isso deixa você com uma bagunça de elenco. Eu acho que você está preso a algo desagradável assim:

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

o (h -> 'my_counter')::integer + 1 o incremento extraindo o valor (h -> 'my_counter'), lançando -o para um número inteiro e adicionando um a ele. Então você constrói um único elemento hstore com hstore('my_counter', ...) e um explícito ::text Elenco no valor para garantir que o PostgreSQL saiba qual função você deseja. Finalmente, você concatena o novo valor-chave no Hstore original com h || hstore(...) para substituir o valor antigo.

Se você não quiser usar essa bagunça um tanto desagradável o tempo todo, poderá embrulhá -la uma função simples e dizer:

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

para esconder a maldade.

Tenho certeza de que existem outras maneiras de fazer isso (usando os vários para/para a matriz funções talvez), mas o exposto acima deve funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top