Могу ли я одновременно считать группы и фильтровать по диапазону клавиш, используя представление CouchDB?
м с использованием CouchDB. Я'Я хотел бы иметь возможность подсчитывать вхождения значений определенных полей в пределах диапазона дат, который может быть указан во время запроса. Я, кажется, могу сделать часть этого, но яУ меня проблемы с пониманием лучшего способа собрать все это вместе.
Предполагается, что документы имеют поле метки времени и другое поле, например:
{ 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'}
Я могу легко создать представление, котороефильтрует документы по гибкому диапазону дат, Это можно сделать с помощью вида, подобного показанному ниже, который вызывается с ключевыми параметрами диапазона, например, ,_view/all-docs?startkey=20120101-0000&endkey=20120201-0000
все-документы / map.js:
function(doc) {
emit(doc.date, doc);
}
С данными выше это вернуло бы представление CouchDB, содержащее только первые 4 документа (единственные документы в диапазоне дат).
Я также могу создать запрос, которыйподсчитывает вхождения данного поля, как это, вызывается с группировкой, то есть:_view/author-count?group=true
автор-граф / map.js:
function(doc) {
emit(doc.author, 1);
}
автор-граф / reduce.js:
function(keys, values, rereduce) {
return sum(values);
}
Это даст что-то вроде:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":2}
]
}
Тем не менее, я могуне могу найти лучший способоба фильтра по дате и количеству вхождений, Например, с данными выше, яхотелось бы иметь возможность указывать параметры диапазона, такие какstartkey=20120101-0000&endkey=20120201-0000
и получить такой результат, где последний документ исключен из подсчета, потому что он находится за пределами указанного диапазона дат:
{
"rows": [
{"key":"bart","value":1},
{"key":"homer","value":2}
{"key":"lisa","value":1}
]
}
Какие'самый элегантный способ сделать это? Это достижимо с помощью одного запроса? Должен ли я использовать другую конструкцию CouchDB, или для этого достаточно представления?