نطاقات مفتاح متعددة كمعلمات لعرض CouchDB

StackOverflow https://stackoverflow.com/questions/1468684

  •  13-09-2019
  •  | 
  •  

سؤال

المشكلة الأساسية - دعونا نقول مستنداتي "التصنيفات" و الطوابع الزمنية. وبعد إذا كنت أريد كل الوثائق في "فو" الفئة التي لها طابع زمني في غضون ساعتين الماضيين، الأمر بسيط:

function (doc) {
  emit([doc.category, doc.timestamp], null);
}

ثم الاستعلام كما

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]

المشكلة تأتي عندما أريد شيئا في الفئات فور أو شريط, ، خلال الساعتين الماضيين. إذا لم أهتم بالوقت، فيمكنني سحب مباشرة عن طريق مجموعة المفاتيح. لسوء الحظ، ليس لدي أي خيار من هذا القبيل مع النطاقات.

ما انتهى به الأمر في غضون الوقت هو تقريب الطابع الزمني إلى كتل ساعتين، ثم مضاعفة الاستعلام:

POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]

إنه يعمل، ولكن سيحصل على فوضوي إذا كنت أريد العودة إلى فترة زمنية كبيرة (في العلاقة مع الحظر).

هل هناك طريقة لإرسال أزواج StartKey / Endkey لعدة عرض، أقرب إلى المفاتيح: [] صفيف يمكن نشرها للحصول على مفاتيح؟

هل كانت مفيدة؟

المحلول

هناك طلب إصدار Couchdb لإعلامك بذلك. لقد أرفقت رقعة بسيطة ولا ضمانات إلى 0.10.1 إلى تلك التذكرة التي قد تعمل من أجلك. إنه يعمل بالنسبة لي ويتيح لي أن أفعل أشياء مثل:

{
    "keys": [
        {
            "startkey": ["0240286524","2010","03","01"],
            "endkey": ["0240286524","2010","03","07",{}]
        },
        {
            "startkey": ["0442257276","2010","03","01"],
            "endkey": ["0442257276","2010","03","07",{}]
        }
    ]
}

في جسم البريد، الذي يتيح لي الحصول على جميع البيانات عبر معرفات تتبع متعددة، لمجموعة من التواريخ. أنا أسمي مع group=true&group_level=1 للحصول على النتائج مجمعة عن طريق معرف تتبع. سيسمح لي مستويات المجموعة العميقة بالجماعة حسب معرف التعقب | سنة وتتبع معرف | السنة | الشهر إلخ.

كانت اتصالات متعددة في النفقات العامة غير القابلة للكسر بالنسبة لي كما كنت أتطلع إلى جعل 2000 بشكل متزامن :) (لا، عرض جديد ليس خيارا - نحن بالفعل في 400 جيجابايت للبيانات بالإضافة إلى طريقة عرض واحدة!)

القضية والتصحيح في https://issues.apache.org/jira/browse/couchdb-523. .

نصائح أخرى

ربما كنت أفضل حالا فقط القيام باسلاحنتين. يمكن أن يتعامل CouchDB التعامل مع العديد من الاستعلامات المتزامنة جيدا جدا تدور خارج العديد من العمليات / المواضيع والاستعلام عن Docs Foo و Bar بشكل منفصل.

لا يدعم CouchDB حاليا استعلامات متعددة المدى. oring and anding keys غير قابلة للقيام بشكل كبير في استفسار واحد.

تمت إضافة هذا في إصدارات الأحدث من CouchDB. لإضافة نطاقات متعددة من مفاتيح البدء / الإنهاء، يمكنك استخدام طلب نشر لعرضك، مع وجود جسم يبدو مثل هذا:

{
  "queries": [
    { "startkey": 10, "endkey": 11 },
    { "startkey": 16, "endkey": 18 }
  ]
}

أعلم أنه سؤال قديم لكنني وجدت في البداية عندما كنت أبحث عن هذا بالضبط!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top