Couchbase Map / Reduce按文档类型计算总数

时间:2014-04-29 14:41:54

标签: mapreduce couchbase

我将事件数据存储在Couchbase文档中,如下所示:

{ 
  user: {
    id: '0BE2DA2B-9C8F-432D-88C2-B2C1D8D0E4B4',
    device: { 'manufacturer': 'Apple', 'os': 'iOS', 'name': 'iPhone', 'version': '5S' }
  },
  event_type: 'INTERACTION_A',
  country: 'GB',
  timestamp: 1398781631233
}

我创建了Map / Reduce查询,告诉我iPhone用户提交的事件数量。但是,是否可以使用Map / Reduce来查询OS提交事件的唯一设备数量?

每个设备可能已经提交了1000个事件,但结果将显示系统已经看到的操作系统有多少个唯一设备。我试图找到类似这样的数据:

{ 'iOS': 2343, 'Android': 6343 }

是否可以在单个Couchbase视图中执行此操作?

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。您只需在查询中使用group=true&group_level=1

创建一个类似的视图:

map : function(){
  emit(doc.os, null);
}

reduce: _count

然后将group=true&group_level=1添加到您的查询中:

http://127.0.0.1:8092/default/_design/dev_<designDocName>/_view/<viewName>?connection_timeout=60000&limit=10&skip=0&group=true&group_level=1

另请查看此链接以获取更多示例:

Writing a simple group by with map-reduce (Couchbase)

http://hardlifeofapo.com/basic-couchbase-querying-for-sql-people/

http://blog.couchbase.com/understanding-grouplevel-view-queries-compound-keys

答案 1 :(得分:0)

我认为我原来的问题可能过于含糊。但是,我已经达成了这个解决方案:

map: function (doc, meta) {
       emit([doc.user.device.os, doc.user.id], null);
     }

reduce: function (keys, values, rereduce) {
          var os = {};
          keys.forEach(function (k) { os[k] = 1; });
          return Object.keys(os).length;
        }

使用group = true&amp; group_level = 1运行此视图可以获得我想要的内容。

我不相信它会扩展,或者它是否需要考虑重新减少,但它适用于我的测试数据集。