2011-02-09 25 views
14

Przechowuję dane lokalizacji w Couchdb i szukam sposobu na uzyskanie tablicy tylko wartości, zamiast klucza: wartość dla każdego rekordu. Na przykład:Uprość Couchdb JSON odpowiedź

Obecny odpowiedzi

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

ja tylko naprawdę potrzebne:

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

Przyczyną tego wszystkiego jest, aby zminimalizować ilość pasma że odpowiedź JSON zużywa. Nie mogę znaleźć sposobu na przekształcenie widoku w prostą tablicę. Jakieś sugestie?

Dzięki.

Odpowiedz

19

Można użyć funkcji _show and _list, pobierają one dokument lub widok (odpowiednio) i mogą odesłać przekształconą odpowiedź w dowolnym formacie. (w tym przypadku JSON)

Aktualizacja: Przeprowadziłem prosty test z danymi podanymi tutaj na moim CouchDB. Oto funkcja listy, którą napisałem. Dostosuj go do swoich potrzeb. :)

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

Świetne, dzięki! Tak naprawdę nie patrzyłem na funkcje show/list, ponieważ wiki Couchdb sugeruje, że ich głównym celem jest obsługa HTML bezpośrednio (myliłem się). Btw, masz pojęcie o wpływie na wydajność korzystania z pokazu/listy w ten sposób? Sam też poprowadzę testy porównawcze. – Dick

+0

Nie mam pod ręką żadnych numerów. Prawdopodobnie będzie to szybsze (ogólnie) niż szablonowanie po stronie przeglądarki. Również wbudowana obsługa ETag jest doskonałym mechanizmem buforowania. –

+2

Możesz również wysłać JSON w pętli while. Następnie wyślij coś przed i po pętli, aby był prawidłowym JSON (i przecinkiem oddzielają obiekty). Zasadniczo send() można wywoływać tak, jak chcesz, a nie tylko na końcu funkcji. – mikeycgto