1

我在我的一个项目中使用了couchdb.mapping。我有一个名为SupportCase派生的类,Document它包含我想要的所有字段。

我的数据库(称为admin)包含多种文档类型。我type在所有文档中都有一个字段,用于区分它们。我有许多类型的文档"case",我想使用视图来获取它们。我有一个设计文档support,里面有一个名为cases. 如果我使用 请求此视图的结果db.view("support/cases),我会返回一个Row包含我想要的 s 的列表。

但是,我想以某种方式将其包装在SupportCase类中,以便我可以调用单个函数并获取SupportCase系统中所有 s 的列表。我创建了一个ViewField属性

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

现在,如果我打电话SupportCase.all(db),我会收回所有案件。

我不明白的是这个视图是预先计算并存储在数据库中还是按需完成的,类似于db.query. 如果是后者,它会很慢,我想使用预先计算的视图。我怎么做?

4

3 回答 3

3

我认为你需要的是:

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

Documentclass 有一个 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.

于 2011-06-27T23:58:05.737 回答
0

map 函数在某些方面类似于关系数据库中的索引。它不会每次都重新进行,并且当添加新文档时,更新的方式不需要重做所有内容(它是一种树结构)。

这有一个很好的总结

于 2011-05-04T12:44:07.470 回答
0

ViewField 使用预定义的视图,因此一旦构建,速度就会很快。它绝对不使用临时视图。

于 2011-06-27T15:09:27.967 回答