группа в mongoid / mongodb - PullRequest
       11

группа в mongoid / mongodb

2 голосов
/ 02 января 2012

Unit has_many StationInstances

StationInstance принадлежит_ единице

Я хочу сгруппировать экземпляры станций по unit_id в mongoid.

Какой будет запрос для группировки всех экземпляров станцийпо unit_id?

1 Ответ

1 голос
/ 02 января 2012

Вы можете сделать это напрямую, используя group (который внутренне уменьшит карту) в mongo, как вы это делали в sql. код

  db.StationInstance.group({key:{unit_id:true},
                            cond:{},
                            reduce:function(a,b){b.sum++;},
                            initial:{sum:0}});

это вернет только количество

>> [ { "unit_id" : xxxx, "sum" : 1 }, { "unit_id" : zzzzz, "sum" : 2 } ]

Но вы не можете взять с собой предметы StationInstance

Вместо этого Вы можете сделать это с MongoDB map-reduch .. проверьте код ниже

map = function() { 
    emit(this.unit_id,{count:1,StationInstance:this._id}); 
}

В функции карты вы можете группировать по unit_id StationInstance (поскольку он принадлежит unit, у него будет unit_id) и агрегировать его по количеству. поскольку обычный подсчет не возвращает весь объект, мы явно возвращаем идентификатор (или любое другое поле или весь объект, просто this) из StationInstance

reduce = function(k, values) {
    var result = {count: 0, StationInstance: []};
    values.forEach(function(value) {
        result.count += value.count;
        result.StationInstance.push(value.StationInstance);
    });
    return result;
}

и при уменьшении мы считаем сгруппированный элемент и помещаем StationInstances в массив

наконец, выдача

 db.StationInstance.mapReduce(map,reduce,{out: { inline : 1}})

вернет желаемый результат

чтобы сделать это в mongoid , просто stringfiy сопоставьте функции и уменьшите и используйте его как

StationInstance.collection.mapreduce(map,reduce,{:out => {:inline => 1},:raw=>true })
...