2013-08-23 8 views
5

Ho letto alcuni esempi di codice (in particolare dal progetto dimostrativo Couchbase Model Views link) e ho realizzato che la funzione map() è così strana.Perché emettere (meta.id, NULL)

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

Perché il valore della funzione di Emit è nullo, ma il risultato da GetView ("birre", "birra") è sempre perfettamente il valore ???

Per favore aiutatemi!

+0

in realtà a causa della natura javascript, è possibile chiamare solo emettere (doc.name) – avsej

risposta

7

In couchbase, il set di risultati della vista è costruito in background. Se si dispone ad esempio di 1 milione di documenti per ciascuna dimensione 4Kb senza alcuna visualizzazione, occorrono circa 4 GB su disco. Quando si crea una vista con funzione di carta come

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

Di conseguenza ci vuole ulteriore 4Gb sul disco per visualizzare i risultati perché visualizzare i risultati sono memorizzate separatamente. E nella maggior parte dei casi (se si interroga la visualizzazione con il parametro Stale=Ok) la base di utenti restituisce il risultato di tale set di record "precompilati", la base di dati non esegue la scansione di tutti i documenti su ogni query.

Pertanto, l'emmiting delle funzioni Null in map viene utilizzato per impedire l'utilizzo dello spazio su disco e aumenta inoltre la velocità del processo di indicizzazione.

Ora la seconda domanda sulla magia della base di divano quando "deriva da GetView (" birre "," birra ") sta ottenendo il valore perfettamente". Le operazioni Couchbase get(key) e getMulti(keys) sono molto veloci. Quindi quando si interroga la vista che emette null restituisce non solo nulls, inoltre restituisce gli ID dei documenti. Quindi puoi usare manualmente getMulti per quella matrice di ID documento per ottenere il valore del documento o in alcuni SDK c'è il parametro query chiamato IncludeDocs che farà lo stesso automaticamente.