معنى وظيفة الخريطة في Couchdb-pythons ViewField
-
28-10-2019 - |
سؤال
أنا أستخدم 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 طريقة عرض محددة مسبقًا، لذا، بمجرد إنشائها، ستكون سريعة.بالتأكيد لا يستخدم عرضًا مؤقتًا.