2013-08-23 8 views
5

Ich habe einige Beispielcode gelesen (vor allem aus dem Couchbase Model Views Demo-Projekt link) und erkannte, dass die Funktion map() so seltsam ist.Warum emittieren (meta.id, NULL)

function(doc, meta) { 
    if (doc.type == "beer" && doc.name){ 
     emit(doc.name, null); 
    } 
} 

Warum der Wert der emit Funktion ist null, aber das Ergebnis von GetView („Bier“, „Bier“), um den Wert perfekt bekommen ???

Bitte helfen Sie mir!

+0

eigentlich wegen Javascript Natur, können Sie nur emittieren (doc.name) – avsej

Antwort

7

In CouchBase wird das Ergebnisset von usally view im Hintergrund erstellt. Wenn Sie zum Beispiel 1 Million Dokumente jeder Größe 4 KB ohne Ansichten haben, dauert es ~ 4 GB auf der Festplatte. Wenn Sie eine Ansicht mit Kartenfunktion wie

function(doc, meta) { 
    emit(doc.name, doc); 
} 

Als Ergebnis schaffen nehmen sie zusätzliche 4 GB auf der Festplatte für die Darstellung von Ergebnissen, da Ansicht Ergebnisse separat gespeichert werden. Und in den meisten Fällen (wenn Sie die Ansicht mit Parameter Stale=Ok abfragen) gibt couchbase das Ergebnis aus dem "vorkompilierten" Datensatz zurück, couchbase scannt nicht alle Dokumente zu jeder Abfrage.

Das Emittieren von Null in Kartenfunktionen wird verwendet, um die Speicherplatznutzung zu verhindern, und es erhöht auch die Geschwindigkeit des Indizierungsprozesses.

Jetzt die zweite Frage über couchbase Magie, wenn "Ergebnis von GetView (" Bier "," Bier ") den Wert perfekt bekommt". Couchbase get(key) und getMulti(keys) Operationen sind sehr schnell. Wenn Sie also die Ansicht abfragen, die null ausgibt, gibt sie nicht nur nulls zurück, sondern auch Dokument-IDs. Dann können Sie manuell getMulti für dieses Array von Dokument-IDs verwenden, um den Wert von Doc zu erhalten, oder in einigen SDKs gibt es den Abfrageparameter IncludeDocs, der das selbe automatisch macht.