我在我的一个项目中使用couchdb.mapping。我有一个名为SupportCase
的类,它来自Document
,包含我想要的所有字段。
我的数据库(称为admin
)包含多种文档类型。我在所有文档中都有一个type
字段,用于区分它们。我有很多类型为"case"
的文档,我希望使用它来查看。我有一个名为support
的设计文档,其中包含一个名为cases
的视图。如果我使用db.view("support/cases)
请求此视图的结果,我会返回Row
的列表,其中包含我想要的内容。
但是,我想以某种方式将它包含在SupportCase
类中,以便我可以调用单个函数并返回系统中所有SupportCase
的列表。我创建了一个ViewField
属性
@ViewField.define('cases')
def all(self, doc):
if doc.get("type","") == "case":
yield doc["_id"], doc
现在,如果我致电SupportCase.all(db)
,我会收回所有案件。
我不明白的是,此视图是预先计算并存储在数据库中,还是按需执行,类似于db.query
。如果是后者,它会很慢,我想使用预先计算的视图。我该怎么做?
答案 0 :(得分:3)
我认为你需要的是:
@classmethod
def all(cls):
result = cls.view(db, "support/all", include_docs=True)
return result.rows
Document
类有一个classmethod 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
。
答案 1 :(得分:0)
map函数在某些方面类似于关系数据库中的索引。它不是每次都重复,当添加新文档时,它的更新方式不需要重做所有内容(它是一种树结构)。
这非常好summary
答案 2 :(得分:0)
ViewField使用预定义的视图,因此,一旦构建,将会很快。它肯定不会使用临时视图。