Frage

Ich verwende die couchdb.mapping in einem meiner Projekte. Ich habe eine Klasse namens SupportCase, die von Document abgeleitet ist und alle gewünschten Felder enthält.

Meine Datenbank (admin genannt) enthält mehrere Dokumenttypen. Ich habe in allen Dokumenten, die ich zur Unterscheidung verwende, ein generisches Codetagcode-Feld. Ich habe viele Dokumente vom Typ type, die ich mithilfe einer Ansicht erhalten möchte. Ich habe ein Designdokument namens "case" mit einer Ansicht darin namens support. Wenn ich die Ergebnisse dieser Ansicht mit cases anfordere, erhalte ich eine Liste von db.view("support/cases)s zurück, die das haben, was ich will.

Ich möchte dies jedoch irgendwie von der Row-Klasse umschließen lassen, damit ich eine einzelne Funktion aufrufen und eine Liste aller SupportCases im System zurückerhalten kann. Ich habe eine SupportCase-Eigenschaft erstellt

@ViewField.define('cases')
def all(self, doc):
    if doc.get("type","") == "case":
        yield doc["_id"], doc

Wenn ich jetzt ViewField aufrufe, bekomme ich alle Fälle zurück.

Was ich nicht verstehe, ist, ob diese Ansicht vorberechnet und in der Datenbank gespeichert oder bei Bedarf ähnlich wie SupportCase.all(db) erstellt wird. Wenn es das letztere ist, wird es langsam sein und ich möchte eine vorberechnete Ansicht verwenden. Wie mache ich das?

War es hilfreich?

Lösung

Ich denke, was Sie brauchen, ist:

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

Document-Klasse verfügt über eine Klassenmethode view, die die Zeilen nach Klassen umschließt, für die sie aufgerufen wird.Im Folgenden erhalten Sie einen ViewResult mit Zeilen vom Typ SupportCase. Wenn Sie den .rows verwenden, erhalten Sie eine Liste der Unterstützungsfälle.

SupportCase.view(db, viewname, include_docs=True)

Und ich glaube nicht, dass Sie in die ViewField-Magie eintauchen müssen.Aber lassen Sie mich erklären, wie es funktioniert.Betrachten Sie das folgende Beispiel aus der CouchDB-python-Dokumentation.

class Person(Document):
     @ViewField.define('people')
     def by_name(doc):
         yield doc['name'], doc

Ich denke, das entspricht:

class Person(Document):
    @classmethod
    def by_name(cls, db, **kw):
        return cls.view(db, **kw)

Mit der ursprünglichen Funktion, die an den People.by_name.map_fun angehängt ist.

Andere Tipps

Die Kartenfunktion ist in gewisser Weise analog zu einem Index in einer relationalen Datenbank.Es wird nicht jedes Mal erneut ausgeführt, und wenn neue Dokumente hinzugefügt werden, muss bei der Aktualisierung nicht alles erneut erstellt werden (es handelt sich um eine Art Baumstruktur).

Dies hat eine ziemlich gute Zusammenfassung

ViewField verwendet eine vordefinierte Ansicht, sodass sie nach dem Erstellen schnell ist.Es wird definitiv keine temporäre Ansicht verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top