0

我有以下文件

{
  "_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 数据库中,我可以执行 2 个查询,limit 2然后合并结果。

4

2 回答 2

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 方法

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

a = a.slice(0, 2);
于 2012-11-06T10:20:20.743 回答
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选项,但它也会反转作者字符串的顺序。这不是字符串的自然顺序,您将来可能需要它;)

于 2012-11-06T11:09:00.060 回答