【问题标题】:Select top/latest 10 in couchdb?在 couchdb 中选择前/最新的 10 个?
【发布时间】:2010-04-06 03:31:15
【问题描述】:

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

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

title   body   modified

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

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

title   category   body   modified

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

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

【问题讨论】:

  • 您是否有不想手动操作的原因?首先查询可用类别,然后查询每个类别的列表。批量执行第二个查询,这几乎就像查询一样。
  • 我可以做到,是的 - 但我的问题是,在 couchdb 中,在一个查询中,这样的事情是否可行。例如,可以在 sql 中使用非常复杂的嵌套选择语句来执行此操作。

标签: couchdb adhoc adhoc-queries


【解决方案1】:

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

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

您将获得前 10 个文档。

视图行按key排序;在查询字符串中添加 descending=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

【讨论】:

  • 第二个查询实际上会选择每个类别中的最新 10 个项目吗?或者只是一个类别的最新 10 件商品?
  • 糟糕。我误读了你的问题。它从一个类别中选择最新的 10 个项目。
【解决方案2】:

这是你需要做的。

地图功能

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 变量传递数字。

这里有更多视图/列表trickery。

【讨论】:

  • 酷,我会测试一下并回复你!
  • 我没有测试这个答案,但无论如何我都会接受它,因为我不再使用 couchdb。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2016-04-13
    • 2013-11-04
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多