Używam CouchDB. Chciałbym móc zliczyć wystąpienia wartości określonych pól w zakresie dat, który można określić w czasie zapytania. Wydaje mi się, że jestem w stanie zrobić części tego, ale mam problem ze zrozumieniem najlepszego sposobu, aby to wszystko połączyć.Korzystając z widoku CouchDB, mogę liczyć grupy i filtrować według zakresu klawiszy w tym samym czasie?
Zakładając dokumentów, które mają pola datownika i innego pola, np .:
{ date: '20120101-1853', author: 'bart' }
{ date: '20120102-1850', author: 'homer'}
{ date: '20120103-2359', author: 'homer'}
{ date: '20120104-1200', author: 'lisa'}
{ date: '20120815-1250', author: 'lisa'}
mogę łatwo utworzyć widok, który Filtry dokumenty za pomocą elastycznego zakresu dat. Można to zrobić w widoku podobnym do poniższego, wywołanego parametrami zakresu klucza, np. _view/all-docs?startkey=20120101-0000&endkey=20120201-0000
.
all-Docs/map.js:
function(doc) {
emit(doc.date, doc);
}
z powyższych danych, że ten powrót widok couchdb zawierającą tylko 4 pierwsze Dokumenty (tylko Dokumenty w przedziale czasowym).
mogę również utworzyć kwerendę zlicza wystąpienia danej dziedzinie, jak ten, zwany z grupy, tj _view/author-count?group=true
:
autor-count/map.js:
function(doc) {
emit(doc.author, 1);
}
autor-count/reduce.js:
function(keys, values, rereduce) {
return sum(values);
}
to przyniesie coś takiego:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":2}
]
}
Jednak nie mogę znaleźć najlepszy sposób, aby zarówno filtr według daty i liczyć wystąpienia. Na przykład, dla powyższych danych, chciałbym móc określić parametry zakresu, takie jak startkey=20120101-0000&endkey=20120201-0000
i uzyskać wynik podobny do tego, w którym ostatni dokument został wykluczony z licznika, ponieważ znajduje się poza określonym zakresem dat:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":1}
]
}
Jaki jest najbardziej elegancki sposób na zrobienie tego? Czy można to osiągnąć za pomocą pojedynczego zapytania? Czy powinienem używać innej konstrukcji CouchDB, czy też wystarczy do tego widok?
Moja pierwsza myśl to zapytanie o zakres dat, a następnie użycie funkcji [_list] (http://wiki.apache.org/couchdb/Formatting_with_Show_and_List#Listing_Views_with_CouchDB_0.10_and_later) w celu zrobienia grupy/liczenia. Nie można operować na wielu kluczach w ramach tego samego zapytania, więc potrzebna jest druga warstwa. –