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

Как выполнить запрос, эквивалентный "select top 10" в couch db?

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

title   body   modified

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

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

title   category   body   modified

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

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

Ответ 1

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

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

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.

Ниже приведен фрагмент

Ответ 2

Чтобы получить первые 10 документов с вашего db, вы можете использовать опцию ограничения запросов. Например. вызов

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10

Вы получаете первые 10 документов.

Просмотр строк сортируется по ключу; добавление descending = true в querystring изменит их порядок. Вы также можете испускать только интересующие вас документы, снова используя запрос, чтобы выбрать интересующие вас клавиши. Поэтому, на ваш взгляд, вы пишете свою функцию карты, например:

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

Ответ 3

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

function sortCategory(a,b) { return b.value - a.value; }