2011-02-09 5 views
14

Je stocke des données de localisation dans Couchdb, et je cherche un moyen d'obtenir un tableau de seulement les valeurs, au lieu de clé: valeur pour chaque enregistrement. Par exemple:Simplify Couchdb réponse JSON

La réponse actuelle

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

Je ne vraiment besoin:

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

La raison de tout cela est de minimiser la quantité de bande passante qu'une réponse JSON consomme. Je n'arrive pas à trouver un moyen de transformer la vue en un simple tableau. Aucune suggestion?

Merci.

Répondre

19

Vous pouvez utiliser les fonctions _show and _list, ils prennent un document ou une vue (respectivement) et peuvent renvoyer une réponse transformée dans le format dont vous avez besoin. (dans ce cas, JSON)

Mise à jour: J'ai effectué un test simple avec les données que vous avez fournies ici sur mon propre CouchDB. Voici la fonction de liste que j'ai fini par écrire. Customisez-le pour adapter à vos besoins. :)

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

Très bien, merci! Je n'avais pas encore vraiment regardé les fonctions show/list puisque le wiki de Couchdb suggère que leur but principal est de servir le HTML directement (j'avais tort). Btw, avez-vous une idée de l'impact sur les performances de l'utilisation d'un spectacle/liste comme ça? Je vais aussi faire des benchmarks. – Dick

+0

Je n'ai pas de numéro en main. Ce sera probablement plus rapide (en général) que de faire des templates sur le navigateur. En outre, le support ETag intégré est un excellent mécanisme de mise en cache à exploiter. –

+2

Vous pouvez également envoyer JSON dans la boucle while. Puis envoyez quelque chose avant et après la boucle pour en faire un JSON valide (et une virgule séparent les objets). Fondamentalement, send() peut être appelé autant de fois que vous le voulez et pas seulement à la fin de la fonction. – mikeycgto