2011-02-09 15 views
14

Sto memorizzando i dati di posizione in Couchdb e sto cercando un modo per ottenere un array di soli valori, invece di chiave: valore per ogni record. Per esempio:Simplify Couchdb Risposta JSON

La risposta attuale

{"total rows": 250, "offset": 0, "rows":[ 
    {"id": "ec5de6de2cf7bcac9a2a2a76de5738e4", "key": "user1", "value": {"city": "San Francisco", "address":"1001 Bayhill Dr"}, 
    {"id": "ec5de6de2cf7bcac9a2a2a76de573ae4","key": "user1", "value": {"city": "Palo Alto", "address":"583 Waverley St"} 
    ... (etc). 
]} 

Ho solo davvero bisogno:

[{"city": "San Francisco", "address":"1001 Bayhill Dr"}, 
{"city": "Palo Alto", "address":"583 Waverley St"}, 
...] 

La ragione di tutto questo è di ridurre al minimo la quantità di larghezza di banda che una risposta JSON consuma. Non riesco a trovare un modo per trasformare la vista in un semplice array. Eventuali suggerimenti?

Grazie.

risposta

19

È possibile utilizzare le funzioni _show and _list, che accettano un documento o una vista (rispettivamente) e possono inviare una risposta trasformata in qualsiasi formato necessario. (in questo caso, JSON)

Aggiornamento: Ho eseguito un semplice test con i dati forniti qui sul mio CouchDB. Ecco la funzione lista che ho finito per scrivere. Personalizza per soddisfare le tue esigenze. :)

function (head, req) { 
    // specify that we're providing a JSON response 
    provides('json', function() { 
     // create an array for our result set 
     var results = []; 

     while (row = getRow()) { 
      results.push({ 
       city: row.value.city, 
       address: row.value.address 
      }); 
     } 

     // make sure to stringify the results :) 
     send(JSON.stringify(results)); 
    }); 
} 
+0

Grande, grazie! Non avevo ancora guardato le funzioni show/list dal momento che il wiki di Couchdb suggerisce che il loro scopo principale è quello di servire direttamente l'HTML (ho sbagliato). Btw, hai un'idea dell'impatto sulle prestazioni dell'utilizzo di uno show/elenco come questo? Anche io gestirò alcuni benchmark. – Dick

+0

Non ho numeri a portata di mano. Probabilmente sarà più veloce (in generale) rispetto ai modelli sul lato browser. Inoltre, il supporto ETag integrato è un ottimo meccanismo di caching da sfruttare. –

+2

È anche possibile inviare JSON all'interno del ciclo while. Quindi invia qualcosa prima e dopo il ciclo per renderlo un JSON valido (e la virgola separa gli oggetti). In sostanza, send() può essere chiamato tutte le volte che vuoi e non solo alla fine della funzione. – mikeycgto