Выберите топ / последние 10 в couchdb?

Как бы я выполнить запрос, эквивалентный "выбрать топ-10" в диване БД?

Например, у меня есть "схема", например, так:

title   body   modified

и я хочу выбрать последние 10 измененных документов.

В качестве дополнительного бонуса, если кто-то может придумать способ сделать то же самое только для каждой категории. Таким образом, для:

title   category   body   modified

вернуть список последних 10 документов в каждой категории.

Мне просто интересно, если такой запрос возможен в couchdb.

3 ответа

Решение

Вот что вам нужно сделать.

Функция карты

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 переменная.

Вот еще немного обмана View/List.

Чтобы получить первые 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

Небольшая коррекция. сортировка не производилась до тех пор, пока я не добавил ключевое слово return в функцию sortCategory. Должно быть так:

function sortCategory(a,b) { return b.value - a.value; }
Другие вопросы по тегам