2010-05-03 13 views
9

Da http://wiki.apache.org/couchdb/Introduction_to_CouchDB_viewsbisogno di spiegazioni di couchdb ridurre funzione

La couchdb ridurre funzione è definita come

function (key, values, rereduce) { 
    return sum(values); 
} 
  • chiave sarà una matrice i cui elementi sono matrici di forma [chiave , id]
  • valori saranno una matrice dei valori emessi per il resp elementi rifrangenti a tasti
  • cioè riducono ([[key1, ID1], [key2, ID2], [key3, ID3]], [valore1, valore2, value3], falso)

riscontrano difficoltà a capire quando/perché la matrice di chiavi conterrebbe valori chiave diversi. Se la matrice di chiavi contiene valori chiave diversi, come dovrei gestirli?

Ad esempio, si supponga che il mio database contenga movimenti tra gli account del modulo.

{"amount":100, "CreditAccount":"account_number", "DebitAccount":"account_number"} 

Voglio una visione che dà l'equilibrio di un account.

La mia funzione mappa fa:

emit(doc.CreditAccount, doc.amount) 
emit(doc.DebitAccount, -doc.amount) 

Il mio ridurre la funzione fa:

ritorno somma (valori);

Mi sembra di ottenere i risultati attesi, tuttavia non riesco a conciliarlo con la possibilità che la mia funzione di riduzione ottenga valori chiave diversi.

La mia funzione di riduzione dovrebbe raggruppare i valori chiave per primi? Che tipo di risultato dovrei tornare in quel caso?

risposta

3

Per impostazione predefinita, Futon "raggruppa" i risultati, il che significa che si ottiene una nuova riduzione per chiave — nel proprio caso, un account. La funzione di gruppo è esattamente per questa situazione.

Sopra l'API HTTP non elaborata, si otterrà una riduzione totale per tutti gli account che probabilmente non è utile. Quindi ricorda di usare group = true nella tua applicazione per essere sicuro di ottenere i riepiloghi per account.

+0

Potete fare in modo di ottenere tutti i valori nel parametro chiave con lo stesso valore di chiave in questo caso? – Alan

+0

Si * otterrà * tutti i valori nel risultato della query HTTP. In altre parole, il tuo saldo sarà corretto. Comunque tu ** non puoi ** contare su tutti i valori passati alla funzione 'reduce()' in un colpo solo. Questo è uno dei principali trade-off di CouchDB. – JasonSmith

+0

In altre parole, la funzione che hai dichiarato funzionerà perché ** supponendo group = true ** si accumulerà sempre per un account. Quando viene avviato un altro account, il valore verrà reimpostato su 0 per te. – JasonSmith

Problemi correlati