在couchdb中选择最新/最新10?

And*_*yuk 12 couchdb adhoc-queries adhoc

我如何在沙发数据库中执行相当于"选择前10名"的查询?

例如,我有一个像这样的"架构":

title   body   modified
Run Code Online (Sandbox Code Playgroud)

我想选择最近10个修改过的文件.

如果有人能想出一种方法只针对每个类别做同样的事情,那么这是一个额外的好处.因此对于:

title   category   body   modified
Run Code Online (Sandbox Code Playgroud)

返回每个类别中最新10个文档的列表.

我只是想知道在couchdb中是否可以进行这样的查询.

小智 7

要从数据库中获取前10个文档,可以使用限制查询选项.比如打电话

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10
Run Code Online (Sandbox Code Playgroud)

你得到前10个文件.

视图行按键排序; 在查询字符串中添加descending = true将反转它们的顺序.您还可以再次使用查询字符串发出您感兴趣的文档,以选择您感兴趣的键.因此,在您的视图中,您可以编写以下地图函数:

function(doc) {
    emit([doc.category, doc.modified], doc);
}
Run Code Online (Sandbox Code Playgroud)

你这样查询:

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true
Run Code Online (Sandbox Code Playgroud)


小智 3

这就是你需要做的。

地图功能

function(doc)
{
  if (doc.category)
  {
    emit(['category', doc.category], doc.modified);
  }
}
Run Code Online (Sandbox Code Playgroud)

那么你需要一个列表函数来对它们进行分组,你可能会想滥用reduce并执行此操作,但它可能会抛出错误,因为对于大量数据集来说,reduce速度不够快。

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));  
}
Run Code Online (Sandbox Code Playgroud)

您现在可以通过以下方式获得所有类别前 10 名

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories
Run Code Online (Sandbox Code Playgroud)

并获取文档

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true
Run Code Online (Sandbox Code Playgroud)

现在您可以使用多范围 POST 查询并限制哪些类别

curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
Run Code Online (Sandbox Code Playgroud)

您也可以不进行硬编码10并通过变量传递数字req

这里还有一些查看/列表技巧