2012-01-02 4 views
2

Unit has_many StationInstancesгруппа по Mongoid в/MongoDB

StationInstance belongs_to блок

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

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

ответ

1

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

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

В функции карты вы можете группировать unit_ id of StationInstance (поскольку он принадлежит единице, он будет иметь 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 }) 
+0

Он работал с некоторыми коррективами. Но неясно, что делает это '{: inline => 1}' и ': raw => true'? – Autodidact

+0

@Millisami, inline - это опция вывода для уменьшения, означает, что она сообщает монго выполнить в памяти, не создавая никаких временных наборов тем, что подходит, если данные малы. проверьте ссылку для получения дополнительной информации http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions – RameshVel

+0

В функции map мы испускаем 'unit_id' как' emit (this.unit_id, {count: 1 , StationInstance: this._id}); 'Что делать, если вместо' this.unit_id' я хочу получить заголовок единицы, который находится в модели документа unit? – Autodidact