Выберите топ / последние 10 в couchdb? - PullRequest
12 голосов
/ 06 апреля 2010

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

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

title   body   modified

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

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

title   category   body   modified

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

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

Ответы [ 3 ]

7 голосов
/ 06 апреля 2010

Чтобы получить первые 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
3 голосов
/ 20 апреля 2010

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

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

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.

Вот еще немного Посмотреть / Список Обман .

0 голосов
/ 05 апреля 2012

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

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