Значение функции карты в couchdb-pythons ViewField - PullRequest
1 голос
/ 04 мая 2011

Я использую 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 ]

3 голосов
/ 28 июня 2011

Я думаю, что вам нужно:

@classmethod
def all(cls):
    result = cls.view(db, "support/all", include_docs=True)
    return result.rows

Document класс имеет метод classmethod 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.

0 голосов
/ 27 июня 2011

ViewField использует предопределенный вид, поэтому после его создания он будет быстрым. Это определенно не использует временное представление.

0 голосов
/ 04 мая 2011

Функция map в некотором смысле аналогична индексу в реляционной базе данных.Это не повторяется каждый раз, и когда новые документы добавляются в том виде, в котором они обновляются, не требуется переделывать все (это своего рода древовидная структура).

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

...