Считать документы определенного типа (предварительно отфильтровать пользователя) - PullRequest
3 голосов
/ 26 августа 2011

Документы (псевдо, 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

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

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

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

Ответы [ 2 ]

5 голосов
/ 26 августа 2011

Вы можете POST на ваш взгляд с таким телом;

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

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

4 голосов
/ 26 августа 2011

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

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

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

...