Вы можете сделать это напрямую, используя 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 })