2011-02-09 17 views
14

Estoy almacenando datos de ubicación en Couchdb, y estoy buscando una manera de obtener una matriz de solo los valores, en lugar de la clave: valor para cada registro. Por ejemplo:Simplifique la respuesta JSON de Couchdb

La respuesta actual

{"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). 
]} 

lo único que realmente necesita:

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

La razón de todo esto es reducir al mínimo la cantidad de ancho de banda que consume una respuesta JSON. Parece que no puedo encontrar una manera de transformar la vista en una matriz simple. ¿Alguna sugerencia?

Gracias.

Respuesta

19

Puede usar las funciones _show and _list, toman un documento o una vista (respectivamente) y pueden enviar de vuelta una respuesta transformada en cualquier formato que necesite. (en este caso, JSON)

Actualización: Ejecuté una prueba simple con los datos que proporcionó aquí en mi propio CouchDB. Aquí está la función de lista que terminé escribiendo. Personalícelo para que se ajuste a sus necesidades. :)

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

Genial, gracias! Realmente no había mirado funciones de show/list aún, ya que el wiki de Couchdb sugiere que su objetivo principal es servir HTML directamente (estaba equivocado). Por cierto, ¿tiene una idea del impacto en el rendimiento de usar un programa/lista como este? Voy a ejecutar algunos puntos de referencia a mí mismo también. – Dick

+0

No tengo ningún número a la mano. Probablemente sea más rápido (en general) que la creación de plantillas en el lado del navegador. Además, el soporte de ETag incorporado es un gran mecanismo de almacenamiento en caché para aprovechar. –

+2

También puede enviar JSON dentro del ciclo while. A continuación, envíe algo antes y después del ciclo para que sea un JSON válido (y coma los objetos por separado). Básicamente, send() se puede llamar tantas veces como se desee y no solo al final de la función. – mikeycgto