sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoid Group By eller MongoDb group by in rails

Som nämnts i kommentarerna kan du använda map/reduce för detta ändamål. Så du kan definiera följande metod i din modell ( 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

vilket skulle resultera i följande resultat:

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

där _id är course_id och count är antalet spelningar.

Det finns också en dedikerad gruppmetod i MongoDB men jag är inte säker på hur jag kommer till den nakna mongodb-samlingen i Mongoid 3. Jag hade inte en chans att dyka in i kod så mycket ännu.

Du kanske undrar varför jag skickar ut ett dokument {count: 1} eftersom det inte spelar så stor roll och jag kunde bara ha skickat ut ett tomt dokument eller något och sedan alltid lägga till 1 till result.count för varje värde. Saken är att reducering inte anropas om bara en sändning har gjorts för en viss nyckel (i mitt exempel course_id har bara spelats en gång) så det är bättre att skicka ut dokument i samma format som resultatet.



  1. Mongoose Unika värden i kapslad array av objekt

  2. Hur får jag åtkomst till Meteors MongoDB från en annan klient medan Meteor körs?

  3. Mongoose:djup population (befolka ett befolkat fält)

  4. nginx uwsgi websockets 502 Bad Gateway uppströms stängde i förtid anslutning vid läsning av svarshuvud från uppströms