Документы (псевдо, 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 ответа
Для этого можно выполнить запрос диапазона:
.../count?startkey=["steve",1]&endkey=["steve",3]&group=true&reduce=true
Будет извлечена одна строка для каждого ключа от ["steve",1]
до ["steve",3]
включительно. Вы можете настроить значения 0
и 3
в соответствии с вашими типами. Например, если ваши типы могут быть любым скалярным значением, вы можете использовать ["steve",null]
и ["steve",{}]
в качестве границ диапазона.
Вы можете выполнить POST в своем представлении с таким телом;
{"keys":[["steve",1], ["steve",2]]}
Кроме того, попробуйте использовать «_sum» в качестве функции сокращения, она будет работать изначально в Erlang и должна быть в несколько раз быстрее, чем в Javascript.
Похожие вопросы
Новые вопросы
couchdb
Apache CouchDB - это документно-ориентированная база данных, которую можно запрашивать и индексировать способом MapReduce. Он предоставляет чистый успокоительный API, что делает возможным взаимодействие с любым языком с возможностью отправки HTTP-запросов. Это также позволяет «Futon», интерфейсу администрирования, полностью работать в браузере. Он также предлагает пошаговую репликацию с обнаружением и разрешением двунаправленных конфликтов.