CouchDB-Python中ViewField的map函数含义
我在一个项目中使用了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 个回答
ViewField使用的是一个预先定义好的视图,所以一旦建立起来,它的速度会很快。它绝对不会使用临时视图。
map函数在某种程度上可以和关系数据库中的索引类比。它不是每次都要重新执行,当有新文档添加时,更新的方式不需要把所有东西都重新做一遍(它是一种树形结构)。
这里有一个不错的总结
我觉得你需要的是:
@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
关联在一起的。