Как я выполнил бы запрос, эквивалентный для "выбора лучших 10" в дб дивана?
Например, у меня есть "схема" как так:
title body modified
и я хочу выбрать последние 10 измененных документов.
Как добавленная премия, если кто-либо может придумать способ сделать то же только на категорию. Таким образом для:
title category body modified
возвратите список последних 10 документов в каждой категории.
Я просто задаюсь вопросом, возможен ли такой запрос в couchdb.
вот что вам нужно сделать.
Функция сопоставления
function(doc)
{
if (doc.category)
{
emit(['category', doc.category], doc.modified);
}
}
, тогда вам понадобится функция списка, которая группирует их, у вас может возникнуть соблазн злоупотребить сокращением и сделать это, но это, вероятно, вызовет ошибки из-за недостаточно быстрого сокращения с большими наборами данных.
function(head, req)
{
% this sort function assumes that modifed is a number
% and it sorts in descending order
function sortCategory(a,b) { b.value - a.value; }
var categories = {};
var category;
var id;
var row;
while (row = getRow())
{
if (!categories[row.key[0]])
{
categories[row.key[0]] = [];
}
categories[row.key[0]].push(row);
}
for (var cat in categories)
{
categories[cat].sort(sortCategory);
categories[cat] = categories[cat].slice(0,10);
}
send(toJSON(categories));
}
теперь вы можете получить все 10 лучших категорий с помощью
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories
и получить документы с помощью
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true
, теперь вы можете запросить это с помощью POST с несколькими диапазонами и ограничить, какие категории
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
вы также не можете жестко закодировать 10
и передать число через переменную req
.
Чтобы получить первые 10 документов из базы данных, вы можете использовать параметр запроса ограничения. Например. позвонив по номеру
http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10
, вы получите первые 10 документов.
Просмотр строк сортируется по ключу; добавление убывающего = true в строку запроса изменит их порядок. Вы также можете генерировать только те документы, которые вам интересны, снова используя строку запроса для выбора интересующих вас ключей. Итак, в вашем представлении вы пишете свою функцию карты, например:
function(doc) {
emit([doc.category, doc.modified], doc);
}
И вы запрашиваете ее следующим образом:
http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true