sql >> データベース >  >> NoSQL >> MongoDB

MongoidGroupByまたはMongoDbgroupby in rails

    コメントで述べたように、この目的のためにmap/reduceを使用できます。したがって、モデルで次のメソッドを定義できます(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
    

    その結果、次の結果になります:

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

    ここで、_id course_idです およびcount は再生回数です。

    MongoDBには専用のグループメソッドもありますが、Mongoid3の裸のmongodbコレクションにアクセスする方法がわかりません。まだコードに飛び込む機会がありませんでした。

    なぜ私がドキュメントを発行するのか不思議に思うかもしれません{count: 1} それほど重要ではなく、空のドキュメントなどを発行して、すべての値のresult.countに常に1を追加することもできます。重要なのは、特定のキー(私の例ではcourse_id)に対して1つのemitのみが実行された場合、reduceは呼び出されないということです。 一度だけ再生された)ので、結果として同じ形式でドキュメントを発行することをお勧めします。



    1. MongoDBでコレクションを作成、表示、ドロップする方法

    2. Java mongodbドライバーの_idフィールドを使用してドキュメントをクエリする方法は?

    3. redisの`DUMP`と`RESTORE`(オフライン)の使い方は?

    4. mongoは配列データをアップサートできますか?