2016-03-24 3 views
3

Im Kapitel Collation anzeigen der offiziellen Dokumentation der CouchDB unter dem ersten Beispiel (http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-collation) wird empfohlen, das Dokument selbst nicht in der Ansicht auszugeben. Stattdessen wird empfohlen, die Textkörper der Dokumente beizufügen Fordern Sie die Ansicht an, indem Sie die Ansicht mit ?include_docs=true anfordern.Warum sollte die CouchDB-Dokumentation, die Dokumente vorschlägt, nicht in der Ansicht ausgegeben werden?

Wenn ich verstehe es richtig, statt:

emit(doc._id, doc); 

und Ergebnisse in folgendem Format erhalten:

{"id":"1","key":"1","value":{"_id": "1", "someProp": "someVal"}}, 

vorgeschlagen wird, aussendet mit Nullwerten zu senden:

emit(doc._id, null) 

und dann beim Abfragen meiner Ansicht mit dem Parameter include_docs Ergebnisse in der folgenden Form erhalten an:

{ 
    "id": "1", 
    "key": "1", 
    "value": null, 
    "doc": { 
     "_id": "1", 
     "_rev": "1-0eee81fecb5aa4f51e285c621271ff02", 
     "someProp": "someVal" 
} 

Wenn es wird vorgeschlagen, als ich die Leistung, das wäre besser vermuten würde, aber leider ist die Dokumentation nicht ausarbeiten, warum und andere Beispiele Dokumente normalerweise als Wert im emit emittieren. Könnte jemand mehr Licht auf dieses Thema werfen?

Antwort

6

Wenn Sie emit das gesamte Dokument in einer Ansicht, duplizieren Sie effektiv das Dokument auf der Festplatte. Dies liegt daran, dass für jede Ansicht eine eigene Datei mit den Ergebnissen der Ausführung der Ansicht in der Datenbank vorhanden ist. Wenn Sie also 3 Ansichten haben, in denen Sie Ihr Dokument ausgeben, haben Sie 4 Kopien, die frei herumlaufen. (nicht mehrere Revisionen von Dokumenten zählen, die natürlich mehr Duplikate hinzufügen)

CouchDB verwendet Speicherplatz sehr großzügig, um Schreibvorgänge schneller zu machen, vor allem aufgrund ihrer Wahl, eine Append-only-Struktur zu verwenden. Daher kann die Verwendung von Ansichten zur wiederholten Ausgabe desselben Dokuments dazu führen, dass die Festplattennutzung sehr schnell anwächst. (Komprimieren Ihrer Datenbank und Sichten im Allgemeinen hilft, aber es sollte nicht etwas sein, in das Sie sich ständig zwingen wollen)

Der Kompromiss zum Verlassen der Dokumente ist, dass CouchDB, wenn Sie aus der Ansicht lesen, muss intern das Dokument finden und es in die Ausgabe der Ansicht einbeziehen. Da es auf der ID basiert, ist es eine sehr schnelle Operation, aber es verursacht immer noch Overhead. Obwohl dieses Muster im Allgemeinen bewährt ist, sollten Sie offen sein, den Trade-off im Kontext Ihrer Bewerbung zu prüfen.

+0

Dank Dominic, so zu rekapitulieren emittieren (doc._id, doc) ist schneller beim Abfragen, aber mehr Speicherplatz wird zum Caching/Indizierung vs emit (doc._id, null) mit include_docs = True möglicherweise langsamer als die Engine verwendet muss aufgrund fehlender zwischengespeicherter/indizierter Dokumente eine Abfrage durchführen, aber wir sparen Speicherplatz. –

+0

@Dominic Barnes Können Sie bestätigen, was Sigman.pl schrieb in seinem Kommentar bitte? – Magiranu

+1

@Magiranu, das klingt richtig für mich –

Verwandte Themen