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 مع hstore('my_counter', ...)
واضحة ::text
يلقي القيمة للتأكد من أن PostgreSQL يعرف الوظيفة التي تريدها. أخيرًا ، تقوم بتسلسل القيمة الرئيسية الجديدة على HSTORE الأصلي مع h || hstore(...)
لاستبدال القيمة القديمة.
إذا كنت لا ترغب في استخدام هذه الفوضى السيئة إلى حد ما طوال الوقت ، فيمكنك لفها وظيفة بسيطة وتقول:
update t
set h = hstore_inc(h, 'my_counter', 1)
where ...
لإخفاء الضيق.
أنا متأكد من أن هناك طرقًا أخرى للقيام بذلك (باستخدام مختلف إلى/من صفيف وظائف ربما) ولكن ما سبق يجب أن يعمل.