Значение функции карты в couchdb-pythons ViewField
Я использую 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 ответа
Я думаю, что вам нужно это:
@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
,
ViewField использует предопределенный вид, поэтому после его создания он будет быстрым. Это определенно не использует временное представление.
Функция map в некотором смысле аналогична индексу в реляционной базе данных. Это не повторяется каждый раз, и при добавлении новых документов способ их обновления не требует переделки всего (это своего рода древовидная структура).
Это довольно хорошее резюме