문제

새로운 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 ...

nastiness를 숨기기 위해.

나는 그것을 할 수있는 다른 방법이 있다고 확신합니다 (다양한 배열로/ 기능은 아마도) 그러나 위는 작동해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top