couchdb-pythons ViewField中map函数的含义

时间:2011-05-04 12:05:35

标签: python couchdb couchdb-python

我在我的一个项目中使用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。如果是后者,它会很慢,我想使用预先计算的视图。我该怎么做?

3 个答案:

答案 0 :(得分:3)

我认为你需要的是:

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

Document类有一个classmethod view,它按类调用行。因此,以下内容会返回ViewResultSupportCase行,其中.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使用预定义的视图,因此,一旦构建,将会很快。它肯定不会使用临时视图。