多个组的分组和限制

时间:2012-11-06 10:13:11

标签: javascript couchdb couchdb-futon

我有以下文件

{
  "_id": "id",
  "_rev": "123456",
  "author": "john",
  "views": "3",
},
{
  "_id": "id",
  "_rev": "123456",
  "author": "jake",
  "views": "5",
},
{
  "_id": "id",
  "_rev": "123456",
  "author": "jake",
  "views": "6",
},
{
  "_id": "id",
  "_rev": "123456",
  "author": "john",
  "views": "1",
},
{
  "_id": "id",
  "_rev": "123456",
  "author": "jake",
  "views": "7",
},
{
  "_id": "id",
  "_rev": "123456",
  "author": "john",
  "views": "10",
}

让我们假设这些是评论,我希望用户能够获得2条评论最多的评论。

我怎样才能在CouchDB中做到这一点?

在任何其他sql数据库中,我可以使用limit 2执行2次查询,然后合并结果。

2 个答案:

答案 0 :(得分:1)

如果您在JavaScript中有一个包含该数据的数组,则只需使用sort方法:

var a = [{...}, {...}, {...}];

a.sort(function(a, b) {
    return b.views - a.views;
});

console.log(a[0]) //{ "_id": "id", "_rev": "123456", "author": "john", "views": "10" }         
console.log(a[1]) //{ "_id": "id", "_rev": "123456", "author": "jake", "views": "7" }

如果您只想查看最常查看的记录,可以使用slice method

var a = [...];
a.sort(...);

a = a.slice(0, 2);

答案 1 :(得分:0)

我猜你可以使用这个map

function (doc) {
  emit([doc.author, -doc.views], null);
}

没有减少。使用选项?startkey=['john']&limit=2进行查询的结果应为:

{"total_rows":5,"offset":0,"rows":[
{"id":"id1","key":["john",-10],"value":null},
{"id":"id2","key":["john",-3],"value":null}
]}

在发出-以获取最大观看次数时请注意doc.view符号。您也可以使用descending=true选项,但它也会颠倒作者字符串的顺序。这不是字符串的自然顺序,您将来可能需要它;)

相关问题