Группировка по значениям в массиве - PullRequest
1 голос
/ 03 сентября 2011

У меня есть набор записей со следующей структурой:

{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 и получаю подсчеты по заданному имени столбца.Дело в том, что я не могу найти правильный способ задать ключевой аргумент групповой операции, чтобы позволить монго правильно сгруппировать результаты.

Есть предложения?

1 Ответ

1 голос
/ 12 сентября 2011

Вы пытаетесь сгруппировать по значению в массиве, и AFAIK group может использовать только поле. Вы можете легко получить набор количества столбцов, используя карту / уменьшить, хотя:

Ваш картограф - это место, где вы будете выполнять группировку. По существу для каждого имени столбца создайте «группу» (emit):

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};
}

Наконец, запустите операцию mapReduce:

var res = db.things.mapReduce(mapper, reducer, {out:"colCounts"});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...