MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongoid Group By ou MongoDb group by in rails


Conforme mencionado nos comentários, você pode usar map/reduce para essa finalidade. Então você pode definir o seguinte método em seu modelo ( 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

que resultaria no seguinte resultado:
[{"_id"=>1.0, "value"=>{"count"=>2.0}}, {"_id"=>2.0, "value"=>{"count"=>1.0}}] 

onde _id é o course_id e count é o número de jogadas.

Também existe um método de grupo dedicado no MongoDB, mas não tenho certeza de como chegar à coleção mongodb vazia no Mongoid 3. Ainda não tive a chance de mergulhar muito no código.

Você pode se perguntar por que eu emito um documento {count: 1} pois não importa muito e eu poderia ter emitido um documento vazio ou qualquer coisa e sempre adicionar 1 ao resultado.contagem para cada valor. O problema é que o reduce não é chamado se apenas uma emissão tiver sido feita para uma chave específica (no meu exemplo course_id foi reproduzido apenas uma vez), portanto, é melhor emitir documentos no mesmo formato como resultado.