MongoDB需要一个 $inc
操作员是因为:
- 如果没有特定的低级支持,在MongoDB中的原子操作很困难。
- 该界面不足以表达
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('my_counter', ...)
和明确的 ::text
施放值,以确保PostgreSQL知道您想要的功能。最后,您将新的键值与原始Hstore相连 h || hstore(...)
更换旧值。
如果您不想一直使用这种令人讨厌的混乱,那么您可以将其包装一个简单的功能并说:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
隐藏恶心。
我确定还有其他方法可以做(使用各种 从数组 也许功能),但是以上应该起作用。