MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoid Group By o MongoDb group by in rails

Come accennato nei commenti, puoi utilizzare map/reduce per questo scopo. Quindi potresti definire il seguente metodo nel tuo modello ( http://mongoid.org/en/mongoid/docs/querying.html#map_reduce )

def self.today
  map = %Q{
    function() {
      emit(this.course_id, {count: 1})
    }
  }

  reduce = %Q{
    function(key, values) {
      var result = {count: 0};
      values.forEach(function(value) {
        result.count += value.count;
      });
      return result;
    }
  }

  self.where(:created_at.gt => Date.today, status: "played").
    map_reduce(map, reduce).out(inline: true)
end

che comporterebbe il seguente risultato:

[{"_id"=>1.0, "value"=>{"count"=>2.0}}, {"_id"=>2.0, "value"=>{"count"=>1.0}}] 

dove _id è il course_id e count è il numero di riproduzioni.

C'è anche un metodo di gruppo dedicato in MongoDB ma non sono sicuro di come arrivare alla raccolta mongodb nuda in Mongoid 3. Non ho ancora avuto la possibilità di immergermi così tanto nel codice.

Potresti chiederti perché emetto un documento {count: 1} dato che non importa molto e avrei potuto semplicemente emettere un documento vuoto o qualsiasi altra cosa e quindi aggiungere sempre 1 al result.count per ogni valore. Il fatto è che reduce non viene chiamato se è stata eseguita solo un'emissione per una chiave particolare (nel mio esempio course_id è stato riprodotto solo una volta) quindi è meglio emettere documenti nello stesso formato come risultato.