我将如何在沙发数据库中执行相当于“选择前 10 名”的查询?
例如,我有一个像这样的“模式”:
title body modified
我想选择最后 10 个修改过的文档。
如果任何人都可以想出一种方法来仅针对每个类别做同样的事情,那么作为额外的奖励。因此对于:
title category body modified
返回每个类别中最新的 10 个文档的列表。
我只是想知道在 couchdb 中是否可以进行这样的查询。
我将如何在沙发数据库中执行相当于“选择前 10 名”的查询?
例如,我有一个像这样的“模式”:
title body modified
我想选择最后 10 个修改过的文档。
如果任何人都可以想出一种方法来仅针对每个类别做同样的事情,那么作为额外的奖励。因此对于:
title category body modified
返回每个类别中最新的 10 个文档的列表。
我只是想知道在 couchdb 中是否可以进行这样的查询。
要从您的数据库中获取前 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
这是你需要做的。
地图功能
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
变量传递数字。
这是更多的查看/列表技巧。
轻微修正。直到我在您的 sortCategory 函数中添加了“return”关键字,它才进行排序。它应该是这样的:
function sortCategory(a,b) { return b.value - a.value; }