CouchDB-Python中ViewField的map函数含义

1 投票
3 回答
513 浏览
提问于 2025-04-16 16:58

我在一个项目中使用了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

ViewField使用的是一个预先定义好的视图,所以一旦建立起来,它的速度会很快。它绝对不会使用临时视图。

0

map函数在某种程度上可以和关系数据库中的索引类比。它不是每次都要重新执行,当有新文档添加时,更新的方式不需要把所有东西都重新做一遍(它是一种树形结构)。

这里有一个不错的总结

3

我觉得你需要的是:

@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关联在一起的。

撰写回答