Вопрос

Новый PG Hstore выглядит потрясающе

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

Но кажется, что это не поддерживает атомно приращение, как MongoDB?

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

Как сделать это с PostgreSQL Hstore?

Это было полезно?

Решение

MongoDB нужен $inc оператор, потому что:

  1. Атомные операции в MongoDB сложны без определенной поддержки низкого уровня.
  2. Интерфейс недостаточно богат, чтобы выразить c = c + 1 без специального оператора.

Вам просто нужно выразить c = c + 1 с Hstores. Эта задача немного усложняется, потому что Hstores используют строки как для ключей, так и для значений, и это оставляет вам беспорядок кастинга. Я думаю, что ты застрял с чем -то неприятным, как это:

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

А (h -> 'my_counter')::integer + 1 увеличивает ли увеличение значения (h -> 'my_counter'), отбрасывая его в целое число и добавляя его к нему. Затем вы строите один элемент Hstore с hstore('my_counter', ...) и явное ::text Сделайте на значение, чтобы убедиться, что PostgreSQL знает, какую функцию вы хотите. Наконец, вы объединяете новое значение ключа на оригинальный Hstore с h || hstore(...) Чтобы заменить старое значение.

Если вы не хотите использовать это немного неприятный беспорядок все время, вы можете обернуть его простую функцию и сказать:

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

скрыть злобу.

Я уверен, что есть и другие способы сделать это (используя различные в/из массива Возможно, функционирует), но вышеперечисленное должно работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top