12

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

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

title   body   modified

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

如果任何人都可以想出一种方法来仅针对每个类别做同样的事情,那么作为额外的奖励。因此对于:

title   category   body   modified

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

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

4

3 回答 3

7

要从您的数据库中获取前 10 个文档,您可以使用限制查询选项。例如调用

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

您将获得前 10 个文档。

查看行按key排序;在查询字符串中添加 descending=true 将反转它们的顺序。您也可以只发出您感兴趣的文档,再次使用查询字符串来选择您感兴趣的键。因此,在您看来,您可以编写 map 函数,例如:

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
于 2010-04-06T08:56:16.890 回答
3

这是你需要做的。

地图功能

function(doc)
{
  if (doc.category)
  {
    emit(['category', doc.category], doc.modified);
  }
}

那么你需要一个列表函数来对它们进行分组,你可能会滥用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));  
}

您现在可以获得所有类别的前 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变量传递数字。

这是更多的查看/列表技巧

于 2010-04-20T04:35:19.480 回答
0

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

function sortCategory(a,b) { return b.value - a.value; }
于 2012-04-04T22:25:53.220 回答