Пользователь может публиковать несколько комментариев в ветке, и я пытаюсь получить список тем (разных), которые пользователь комментировал, например:
// comment table (relation table)
id, thread_id, user_id
select comment.thread_id, count(*)
from user
inner join comment on user.id=comment.user_id
where user.id = ?
group by comment.thread_id;
Это довольно просто в MySQL.
Но для преобразования в couchdb: -
// map
function(doc)
{
emit(doc.user_id, doc.thread_id);
}
// reduce
function (key, thread_id)
{
return thread_id;
}
Если я использую вышеуказанную функцию карты, я столкнусь с такой ошибкой: -
"error": "reduce_overflow_error",
"reason": "Reduce output must shrink more rapidly: Current output: ...
Я думаю, что применил функцию приведения неправильно.
При использовании другого способа, например: -
// map
function (doc)
{
emit([doc.user_id, doc.thread_id], 1);
}
// reduce
function(keys, values)
{
return sum(values);
}
Результат group=true
- это именно то, что делает mysql group-by.
Однако я не могу получить ВСЕ список потоков пользователем (учитывая, что у меня есть только user_id во время запроса)
Третий способ, я могу отказаться от использования карты уменьшить и напрямую применить: -
emit(doc.user_id, doc.thread_id);
И сделать массив PHP вроде
foreach ( ... )
{
$threads[$thread_id] = TRUE;
}
array_keys($threads);
Однако, это довольно раздутый и менее эффективный.
Второй метод выглядит более точно: -
key=[user_id, *] <-- it does not work, believe only work on exact match
key=[user_id, thread_id] <-- return one row
Есть ли способ получить весь результат, не зная thread_id?
(ps: я новичок в couchdb, и я мог бы описать сценарий плохим образом)
Некоторые ссылки, которые я получил через @jasonsmith: - http://guide.couchdb.org/draft/cookbook.html
Как правило, функция сокращения должна сводиться к одному скалярному значению. То есть целое число; строка; или небольшой список или объект фиксированного размера, который включает агрегированное значение (или значения) из аргумента значений. Он никогда не должен просто возвращать значения или подобное. CouchDB предупредит вас, если вы попытаетесь использовать «уменьшить путь»: