sql >> Databáze >  >> NoSQL >> MongoDB

Mongoid Group By nebo MongoDb group by in rails

Jak je uvedeno v komentářích, můžete k tomuto účelu použít map/reduce. Můžete tedy ve svém modelu definovat následující metodu ( 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

což by vedlo k následujícímu výsledku:

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

kde _id je course_id a count je počet přehrání.

V MongoDB je také vyhrazená skupinová metoda, ale nejsem si jistý, jak se dostat k holé kolekci mongodb v Mongoidu 3. Ještě jsem neměl možnost se tolik ponořit do kódu.

Možná se divíte, proč vydávám dokument {count: 1} protože na tom tolik nezáleží a mohl jsem prostě vystavit prázdný dokument nebo cokoli a pak vždy přidat 1 k result.count pro každou hodnotu. Jde o to, že snížení není voláno, pokud bylo pro konkrétní klíč provedeno pouze jedno vydání (v mém příkladu course_id přehráno pouze jednou), takže je lepší vysílat dokumenty ve stejném formátu jako výsledek.



  1. Jak vytvořit Mongo Docker Image s výchozími kolekcemi a daty?

  2. Nelze se ověřit do mongo, ověření se nezdařilo

  3. Importujte data CSV jako pole v MongoDB pomocí mongoimport

  4. Streamování dat NoSQL s MongoDB a Kafka