按数组中的值分组

时间:2011-09-03 13:56:03

标签: mongodb group-by

我有一组具有以下结构的记录:

{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 个答案:

答案 0 :(得分:1)

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

您的映射器是您进行分组的地方。基本上对于每个列名称,创建一个“group”(emit):

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

在您的reducer中,汇总每个组的结果:

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

最后运行mapReduce操作:

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