MongoDB precisa de um $inc
operador porque:
- As operações atômicas no MongoDB são difíceis sem suporte específico de baixo nível.
- 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.