這是一種看起來合理的方法。首先,我繼承了couchdb.design.ViewDefinition。 (評論和pydocs爲簡潔移除。)現在
import couchdb.design
import inflection
DESIGN_NAME="version"
class CurrentVersion(couchdb.design.ViewDefinition):
def __init__(self):
map_fun = self.__class__.map
if hasattr(self.__class__, "reduce"):
reduce_fun = self.__class__.reduce
else:
reduce_fun = None
super_args = (DESIGN_NAME,
inflection.underscore(self.__class__.__name__),
map_fun,
reduce_fun,
'python')
super(CurrentVersion, self).__init__(*super_args)
@staticmethod
def map(doc):
if 'version_key' in doc and 'created_ts' in doc:
yield (doc['version_key'], [doc['_id'], doc['created_ts']])
@staticmethod
def reduce(keys, values, rereduce):
max_index = 0
for index, value in enumerate(values):
if value[1] > values[max_index][1]:
max_index = index
return values[max_index]
,如果我想同步:
import couchdb.design
from couchview.version import CurrentVersion
db = get_couch_db() # omitted for brevity
couchdb.design.ViewDefinition.sync_many(db, [CurrentVersion()], remove_missing=True)
這種方法的好處是:
- 組織。所有設計/視圖都作爲模塊/類(分別)位於一個包中。
- 真實碼。我的文本編輯器將突出語法。我可以針對我的map/reduce函數編寫單元測試。
ViewDefinition子類也可用於查詢。
current_version_view = couchview.version.CurrentVersion()
result = current_version_view(self.db, key=version_key)
它還沒有準備好生產,但我認爲這比在字符串文字中存儲map/reduce函數更近了一步。
編輯:我終於寫了一篇關於該主題的情侶博客文章,因爲我無法找到建議的任何其它來源: