Frage

Ich verwende die folgende Ansicht Funktion, um alle Elemente in der Datenbank zu iterieren (um einen Tag zu finden), aber ich denke, die Leistung ist sehr schlecht, wenn der Datensatz groß ist. Jeder andere Ansatz?

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
War es hilfreich?

Lösung

Disclaimer:. Ich habe das nicht testen und weiß nicht, ob es besser durchführen kann

Erstellen Sie eine einzelne zul Ansicht:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

Und Abfrage mit _view / your_view / all? StartKey = [ 'your_tag_here'] & EndKey = [ 'your_tag_here', {}]

Struktur JSON Resultierende wird etwas anders sein, aber Sie werden immer noch das Datum Sortierung veröffentlichen erhalten.

Andere Tipps

Sie können eine einzelne permanente Ansicht definieren, wie Bahadir vermuten lässt. wenn dabei diese Art von Indexierung, aber nicht Ausgang für jede Taste des doc. Stattdessen emittieren ([tag, doc.published], null). In der aktuellen Release-Versionen werden Sie dann eine separate Suche für jeden doc zu tun haben, aber SVN Stamm hat jetzt Unterstützung für die Angabe „include_docs = True“ in der Abfragezeichenfolge und CouchDB wird die Dokumentation in Ihre Ansicht automatisch für Sie zusammenführen, ohne dass die Raum-Overhead.

Sie sind sehr viel auf dem richtigen Weg mit der Ansicht. Eine Liste von Gedanken aber:

Ansicht Generation ist inkrementell. Wenn Sie lesen sind Verkehr ist größer als Sie Schreibverkehr sind, dann Ihre Ansichten nicht ein Problem überhaupt führen. Menschen, die im Allgemeinen darüber besorgt sind, sollten nicht sein. Bezugsrahmen, sollten Sie besorgt sein, wenn Sie Hunderte von Datensätzen in der Ansicht ohne ein Update Dumping.

ein ganzes Dokument Ausstrahlen werden die Dinge verlangsamen. Sie sollten nur emittieren, was für die Verwendung der Ansicht erforderlich ist.

Nicht sicher, was die val == „% s“ Leistung wäre, aber man sollte denken nicht über die Dinge. Wenn es einen Tag-Array ist, sollten Sie die Tags emittieren. Zugegeben, wenn Sie ein Array-Tags erwarten, die nicht-Strings enthalten wird, dann ist diese ignorieren.

# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

Die byTag Map-Funktion gibt die Daten mit jedem eindeutigen Tag in dem „Schlüssel“, dann jeden Post mit diesem Tag in value, also wenn Sie key = „mytag“ greifen, wird es alle Beiträge mit dem Stichwort „mytag“ abrufen .

Ich habe es gegen etwa 10 Einträge getestet und es scheint etwa 0,0025 Sekunden pro Abfrage zu nehmen, nicht sicher, wie effizient sie mit großen Datenmengen sind ..

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