我有一组具有以下结构的记录:
{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正确地对结果进行分组。
有什么建议吗?
答案 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"});