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

在couchdb中选择前10名/最新10名?,couchdb,adhoc,adhoc-queries,Couchdb,Adhoc,Adhoc Queries,我将如何执行相当于coach db中“选择前10名”的查询 例如,我有这样一个“模式”: 我想选择最后10个修改过的文档 如果任何人都能想出一种方法,只在每个类别中做同样的事情,这将是一个额外的奖励。因此: title category body modified 返回每个类别中最新10个文档的列表 我只是想知道在couchdb中是否可以进行这样的查询。要从数据库中获取前10个文档,可以使用“限制查询”选项。 例如打电话 http://localhost:5984/yourdb/_

我将如何执行相当于coach db中“选择前10名”的查询

例如,我有这样一个“模式”:

我想选择最后10个修改过的文档

如果任何人都能想出一种方法,只在每个类别中做同样的事情,这将是一个额外的奖励。因此:

title   category   body   modified
返回每个类别中最新10个文档的列表


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

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

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10
您将获得前10个文档

视图行按键排序;在querystring中添加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
function sortCategory(a,b) { return b.value - a.value; }

这是你需要做的

映射函数

function(doc)
{
  if (doc.category)
  {
    emit(['category', doc.category], doc.modified);
  }
}
然后您需要一个列表函数来对它们进行分组,您可能会临时滥用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));  
}
您现在可以使用

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
现在,您可以通过一个多范围的帖子来查询,并限制哪些类别

curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'
您也不能硬编码
10
并通过
req
变量传递数字


这里是一些更多的视图/列表。

轻微更正。直到我在sortCategory函数中添加了“return”关键字,它才开始排序。应该是这样的:

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true
function sortCategory(a,b) { return b.value - a.value; }

第二个查询会实际选择每个类别中最近的10个项目吗?或者只是一个类别中最新的10个项目?哎呀。我误解了你的问题。它从一个类别中选择最新的10个项目。您不想手动执行此操作的原因是什么?首先查询可用类别,然后查询每个类别的列表。分批执行第二个查询,这几乎就像在查询中一样。我可以这样做是的,但我的问题是,在couchdb中,在一个查询中是否可以执行类似的操作。例如,可以在sql中使用一个非常复杂的嵌套select语句来实现这一点!我没有测试这个答案,但无论如何我都会接受,因为我不再与couchdb合作。