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

最佳答案

我认为您需要的是:

@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

关于python - Couchdb-Pythons ViewField中map函数的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5883068/

10-12 22:50