سؤال

أنا أستخدم couchdb.mapping في أحد مشاريعي.لدي فصل يسمى SupportCase مستمدة من Document الذي يحتوي على كافة الحقول التي أريدها.

قاعدة البيانات الخاصة بي (تسمى admin) يحتوي على أنواع مستندات متعددة.انا املك type الحقل في جميع المستندات التي أستخدمها للتمييز بينهما.لدي العديد من الوثائق من النوع "case" الذي أريد الحصول عليه باستخدام طريقة العرض.لدي وثيقة تصميم تسمى support مع منظر بداخله يسمى cases.إذا طلبت نتائج هذا العرض باستخدام db.view("support/cases), ، أعود قائمة Rowالتي لديها ما أريد.

ومع ذلك، أريد بطريقة أو بأخرى أن يكون هذا ملفوفًا بواسطة SupportCase class حتى أتمكن من استدعاء وظيفة واحدة واستعادة قائمة بجميع SupportCaseس في النظام.لقد أنشأت أ ViewField ملكية

@ViewField.define('cases')
def all(self, doc):
    if doc.get("type","") == "case":
        yield doc["_id"], doc

الآن، إذا اتصلت SupportCase.all(db), ، أستعيد جميع الحالات.

ما لا أفهمه هو ما إذا كان هذا العرض محسوبًا مسبقًا ومخزنًا في قاعدة البيانات أو يتم إجراؤه عند الطلب بشكل مشابه لـ db.query.إذا كان هذا هو الأخير، فسيكون بطيئًا وأريد استخدام طريقة عرض محسوبة مسبقًا.كيف يمكنني فعل ذلك؟

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

المحلول

أعتقد أن ما تحتاجه هو:

@classmethod
def all(cls):
    result = cls.view(db, "support/all", include_docs=True)
    return result.rows

Document الفصل لديه طريقة الفصل view الذي يغلف الصفوف حسب الفئة التي يطلق عليه.لذلك يعود لك ما يلي أ ViewResult مع صفوف من النوع SupportCase وأخذ .rows من ذلك يعطي قائمة حالات الدعم.

SupportCase.view(db, viewname, include_docs=True)

ولا أعتقد أنك بحاجة للدخول في سحر ViewField.ولكن اسمحوا لي أن أشرح كيف يعمل.النظر في المثال التالي من CouchDB-python توثيق.

class Person(Document):
     @ViewField.define('people')
     def by_name(doc):
         yield doc['name'], doc

أعتقد أن هذا يعادل:

class Person(Document):
    @classmethod
    def by_name(cls, db, **kw):
        return cls.view(db, **kw)

مع الوظيفة الأصلية المرفقة بها People.by_name.map_fun.

نصائح أخرى

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

هذا لديه جيدة جدا ملخص

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

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