Если вы только после последнего поста или последних пяти постов, есть гораздо более простой способ. Вы можете полностью избежать редуктора.
Если вы добавите время в качестве второй части ключа, вы можете использовать комбинацию конечного ключа, убывания и ограничения, чтобы получить последние N сообщений, основанные на идентификаторе потока.
Вот MapReduce, который я написал с некоторыми тестовыми данными, основанными на ваших схемах:
function(doc) {
if (doc.type) {
if (doc.subject) {
emit([doc._id, doc.time], doc.subject);
emit([doc._id, 'Z'], doc.subject);
} else {
emit([doc.thread_id, doc.time], {_id: doc._id});
}
}
}
Странный вывод клавиши 'Z' состоит в том, что вы можете получить предмет из "нижней части" списка предметов.
Параметры запроса будут выглядеть примерно так:
?endkey=["thread_id"]&descending=true&limit=6
Ограничение должно составлять N + 1, где N - количество сообщений, которые вы хотели бы вернуть. В результате вы получите тему темы и _id объекты (или все, что вам нужно) из почтовых документов.
Объекты _id выводятся в этом примере, так что вы можете использовать его с include_docs=true
, если вы хотите полный пост. Добавьте все остальные данные из почтового документа, который вы хотите (заголовок и т. Д.), Чтобы общий размер индекса оставался низким, и используйте include_docs в тех местах, где вам нужно полное содержимое документа. Однако, если вам всегда нужен полный пост-документ, выведите его в emit, поскольку это даст вам более быстрый отклик (хотя и больший размер индекса на диске).
Кроме того, если вам нужен список всех тем, отсортированных по последнему сообщению, а также 5 сообщений в теме, вам необходимо вывести такие ключи, как [time, thread_id, 'thread']
и [time, thread_id, 'post']
и использовать _list
для сбора сообщений. «под» каждым документом цепочки, поскольку сортировка по времени приведет к тому, что потоки и сообщения будут отделяться друг от друга в результатах. Затем можно использовать функцию _list
, чтобы снова их объединить / найти. Однако выполнение двух запросов все еще может быть проще / легче.