Значение функции карты в 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 в некотором смысле аналогична индексу в реляционной базе данных. Это не повторяется каждый раз, и при добавлении новых документов способ их обновления не требует переделки всего (это своего рода древовидная структура).

Это довольно хорошее резюме

Другие вопросы по тегам