2011-09-03 40 views
1

我有以下结构的一组记录:分组由值数组

{u'_id': ObjectId('4e60fc677fdfb50fc3000000'), 
u'columns': [ 
    {u'geodata_type': None, 
    u'has_geodata': False, 
    u'id': 1, 
    u'is_available': True, 
    u'is_key': False, 
    u'name': u'NOMBRE', 
    u'value': u'Martin'}, 
    {u'geodata_type': None, 
    u'has_geodata': False, 
    u'id': 2, 
    u'is_available': True, 
    u'is_key': False, 
    u'name': u'EDAD', 
    u'value': 12}, 
    {u'geodata_type': u'punto', 
    u'has_geodata': True, 
    u'id': 4, 
    u'is_available': True, 
    u'is_key': None, 
    u'name': u'DIRECCION', 
    u'value': u'humberto primero 2345'}, 
    {u'geodata_type': None, 
    u'has_geodata': False, 
    u'id': 5, 
    u'is_available': True, 
    u'is_key': False, 
    u'name': u'BARRIO', 
    u'value': u'centro'}], 
u'datasource_id': 1, 
u'map_empty': True 
} 

我假装组由其中一些columns的所有文件,并获得由给定列名计数。问题是,我没有找到合适的方法来设置组操作的关键参数,让mongo正确地分组结果。

有什么建议吗?

回答

1

您试图对数组中的值进行分组,而AFAIK组只能使用一个字段。您可以使用map/reduce轻松生成一组列计数:

您的映射器就是您要进行分组的地方。基本上每个列名,创建一个 “组”(发射):

var mapper = function() { 
    for (var k in this.columns) { 
     emit(this.columns[k].name, {count:1}); 
    } 
} 

在你减速,汇总各组的结果:

var reducer = function(key, values) { 
    var sum = 0; 
    values.forEach(function (item) { 
     sum+=item.count; 
    }); 
    return {count:sum}; 
} 

最后运行精简操作:

var res = db.things.mapReduce(mapper, reducer, {out:"colCounts"}); 
+0

@tutuca:如果这是正确的答案,如果您将此标记为“已接受”的答案(勾选绿色复选框),我会喜欢它。 - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

+0

当然!如果我的建议有些不便之处,请告诉我,我会看看我能否提供帮助。或者如果你想出一个更好的方法来做到这一点,请让我知道。 –