如何在沙发数据库中执行相当于“select top 10”的查询?
例如,我有一个像这样的“架构”:
title body modified
我想选择最近修改过的10个文档。
如果有人能想出一种方法只针对每个类别做同样的事情,那么这是一个额外的好处。所以:
title category body modified
返回每个类别中最新10个文档的列表。
我只是想知道在couchdb中是否可以进行这样的查询。
答案 0 :(得分:7)
要从数据库中获取前10个文档,可以使用限制查询选项。 例如。打电话
http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10
你得到前10个文件。
查看行按键排序;在查询字符串中添加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
答案 1 :(得分: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
变量传入数字。
这是一些更多的视图/列表trickery。
答案 2 :(得分:0)
function sortCategory(a,b) { return b.value - a.value; }