我将事件数据存储在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来查询操作系统有多少唯一的设备正在提交事件?
每个单独的设备可能已经提交了1000个事件,但结果将显示系统在操作系统中看到了多少独特的设备。我试图得到一个看起来像这样的数据:
{ 'iOS': 2343, 'Android': 6343 }
是否可以在一个Couchbase视图中执行此操作?
是的,这是可能的。您只需要在查询中使用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
还可以查看此链接了解更多示例:
使用map reduce(Couchbase)编写一个简单的组
http://hardlifeofapo.com/basic-couchbase-querying-for-sql-people/
http://blog.couchbase.com/understanding-grouplevel-view-queries-compound-keys
我觉得我最初的问题可能太模糊了。然而,我已经找到了这个解决方案:
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&group_level=1给了我想要的。
我不相信它会扩展,也不相信它是否需要考虑重新缩减,但它适用于我的测试数据集。