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

Mongoid Group By eller MongoDb gruppe af i skinner

Som nævnt i kommentarer kan du bruge kort/reducer til dette formål. Så du kan definere følgende metode i din model ( 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

hvilket ville resultere i følgende resultat:

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

hvor _id er course_id og count er antallet af afspilninger.

Der er også dedikeret gruppemetode i MongoDB, men jeg er ikke sikker på, hvordan jeg kommer til den bare mongodb-samling i Mongoid 3. Jeg havde ikke en chance for at dykke så meget ned i kode endnu.

Du undrer dig måske over, hvorfor jeg udsender et dokument {count: 1} da det ikke betyder så meget, og jeg kunne bare have udsendt et tomt dokument eller noget, og så altid tilføje 1 til result.count for hver værdi. Sagen er, at reducering ikke kaldes, hvis der kun er udført én udsendelse for en bestemt nøgle (i mit eksempel course_id kun er blevet afspillet én gang), så det er bedre at udsende dokumenter i samme format som resultatet.



  1. Opdatering af indlejrede arrays i mongodb

  2. Kunne ikke oprette forbindelse til 127.0.0.1:27017, årsag:errno:111 Forbindelsen blev afvist

  3. Pålidelige biblioteker derude til Spring boot redis integrationstest

  4. Annoncering af ClusterControl 1.4.2 - DevOps Edition