Документы (псевдо, rev и id опущены):

{
   "type": 1,
   "username": "aron",
   "data": { ... }
}
{
   "type": 1,
   "username": "bob",
   "data": { ... }
}
{
   "type": 1,
   "username": "steve",
   "data": { ... }
}
{
   "type": 1,
   "username": "steve",
   "data": { ... }
}
{
   "type": 2,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}
{
   "type": 3,
   "username": "steve",
   "data": { ... }
}

Я хочу знать, сколько у Стива документов типа 1/2/3.

Посмотреть:

count: {
    map: function (doc) { 
        emit([doc.username, doc.type], 1);  
    }
    reduce: function (key, values, rereduce) {
        return sum(values);
    }
}

Сейчас прошу

/database/_design/myDesign/_view/count?key=["steve",1] // result: 2
/database/_design/myDesign/_view/count?key=["steve",2] // result: 1
/database/_design/myDesign/_view/count?key=["steve",3] // result: 3

Это отлично работает .

Чтобы поумнее, мне было интересно, могу ли я запросить это в одном представлении?

Есть ли способ подсчитать количество документов неизвестного количества типов в одном просмотре?

3
Aron Woost 26 Авг 2011 в 16:03

2 ответа

Лучший ответ

Для этого можно выполнить запрос диапазона:

.../count?startkey=["steve",1]&endkey=["steve",3]&group=true&reduce=true

Будет извлечена одна строка для каждого ключа от ["steve",1] до ["steve",3] включительно. Вы можете настроить значения 0 и 3 в соответствии с вашими типами. Например, если ваши типы могут быть любым скалярным значением, вы можете использовать ["steve",null] и ["steve",{}] в качестве границ диапазона.

4
Victor Nicollet 26 Авг 2011 в 14:39

Вы можете выполнить POST в своем представлении с таким телом;

{"keys":[["steve",1], ["steve",2]]}

Кроме того, попробуйте использовать «_sum» в качестве функции сокращения, она будет работать изначально в Erlang и должна быть в несколько раз быстрее, чем в Javascript.

5
Robert Newson 26 Авг 2011 в 12:27