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

mongoose.jsを使用して月と年でグループ化

    Mongooseは、MongoDB集約フレームワークの軽量ラッパーを提供します。アグリゲーションを初めて使用する場合は、MongoDBドキュメントから詳細を確認できます: http:/ /docs.mongodb.org/manual/aggregation/

    データを上記の形式にマッサージするには、一連の$group操作で集計パイプラインを使用できます。ここではマングースフレームワークを使用しています:

    var dateSchema = mongoose.Schema({…});
    var DateItem = mongoose.model('DateItem', dateSchema);
    
    DateItem.aggregate(
          { $group : { 
               _id : { year: { $year : "$accessDate" }, month: { $month : "$accessDate" },day: { $dayOfMonth : "$accessDate" }}, 
               count : { $sum : 1 }}
               }, 
          { $group : { 
               _id : { year: "$_id.year", month: "$_id.month" }, 
               dailyusage: { $push: { day: "$_id.day", count: "$count" }}}
               }, 
          { $group : { 
               _id : { year: "$_id.year" }, 
               monthlyusage: { $push: { month: "$_id.month", dailyusage: "$dailyusage" }}}
               }, 
          function (err, res)
               { if (err) ; // TODO handle error 
                 console.log(res); 
               });
    });
    

    最初の$groupは、このフォームのドキュメントになります。1日1回です:

    { 
      "_id" : { "year" : 2013, "month" : 8, "day" : 15 },
      "count" : 1
    }
    

    2番目の$groupは、月ごとにグループ化されたドキュメントになります:

    {
      "_id" : { "year" : 2012, "month" : 11 },
     "dailyusage" : [
              { "day" : 6, "count" : 1 },
              { "day" : 9, "count" : 1 },
              ... ]
    },
    

    そして、3番目の$ groupは、毎年1つずつ、さらに大きなドキュメントになります。

    このクエリは、データを大きな階層ドキュメントに集約します。ただし、集計後にこのデータに対してクエリを実行する場合は、これがデータの入力に最も役立つ形式ではない可能性があります。集計データをどのように使用するかを検討してください。より小さなドキュメント、おそらく1か月に1つ、または1日に1つを含むスキーマの方が、より便利な場合があります。




    1. Pandas DataFrameに埋め込まれたjsonオブジェクトにアクセスするにはどうすればよいですか?

    2. サーバーインスタンスプールが破棄されました

    3. MongoDB $ last Aggregation Pipeline Operator

    4. 名前の衝突を避けるためにredisでキーに名前空間を付ける方法は?