【问题标题】:Group and limit for multiple groups多组的分组和限制
【发布时间】:2012-11-06 10:13:10
【问题描述】:

我有以下文件

{
  "_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",
}

假设这些是 cmets,我想按用户获取 2 个观看次数最多的 cmets。

如何在 CouchDB 中做到这一点?

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

【问题讨论】:

    标签: javascript couchdb couchdb-futon


    【解决方案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);
    

    【讨论】:

    • 是的,这是正确的,但是观看次数最多的 2 个呢?不止一个。
    • @salamis 如您所见,arr a 的排序方式是查看次数最多的是第一项,查看次数第二多的是第二项。所以a[0]=most viewed & a[1]=second to most viewed
    • 嗯..谢谢..你是对的。现在的问题是这是否是在 CouchDB 中执行此操作的最佳方式..
    • 嗯,把所有的数据从数据库拿到客户端再用JS处理肯定不是最有效的方法;)
    【解决方案2】:

    我猜你可以用这个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 选项,但它也会颠倒作者字符串的顺序。这不是字符串的自然顺序,您将来可能需要它;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多