سؤال

يبدو 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