首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在couchdb中选择前10名/最新10名?

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

Stack Overflow用户
提问于 2010-04-06 11:31:15
回答 3查看 3K关注 0票数 12

如何在couch db中执行等同于"select top 10“的查询?

例如,我有一个"schema“,如下所示:

代码语言:javascript
运行
复制
title   body   modified

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

作为一个额外的奖励,如果有人能想出一种方法来做同样的事情,只针对每个类别。因此,对于:

代码语言:javascript
运行
复制
title   category   body   modified

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-20 12:35:19

这是你需要做的。

Map函数

代码语言:javascript
运行
复制
function(doc)
{
  if (doc.category)
  {
    emit(['category', doc.category], doc.modified);
  }
}

然后你需要一个列表函数来对它们进行分组,你可能会被临时滥用reduce来做这件事,但它可能会抛出错误,因为对于大数据集来说,reduce的速度不够快。

代码语言:javascript
运行
复制
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名

代码语言:javascript
运行
复制
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories

并通过以下命令获取文档:

代码语言:javascript
运行
复制
http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true

现在,您可以使用多范围帖子来查询此内容,并限制哪些类别

代码语言:javascript
运行
复制
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}'

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

下面是更多的视图/列表trickery

票数 3
EN

Stack Overflow用户

发布于 2010-04-06 16:56:17

要从数据库中获取前10个文档,可以使用limit query选项。例如,调用

代码语言:javascript
运行
复制
http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10

您将获得前10个文档。

视图行是按键排序的;在查询字符串中添加descending=true将颠倒它们的顺序。您还可以只发送您感兴趣的文档,再次使用querystring来选择您感兴趣的键。因此,在您的视图中,您可以像这样编写您的map函数:

代码语言:javascript
运行
复制
function(doc) {
    emit([doc.category, doc.modified], doc);
}

你可以这样查询它:

代码语言:javascript
运行
复制
http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true
票数 7
EN

Stack Overflow用户

发布于 2012-04-05 06:25:53

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

代码语言:javascript
运行
复制
function sortCategory(a,b) { return b.value - a.value; }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2582481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档