3

「ユーザー」コレクションがあり、毎日の合計ユーザー数が必要です。例:

01.01.2012 -> 5
02.01.2012 -> 9
03.01.2012 -> 18
04.01.2012 -> 24
05.01.2012 -> 38
06.01.2012 -> 48

各ユーザーの Attribute を作成しました。クエリについて教えてもらえますか?

{ 
  "_id" : ObjectId( "5076d3e70546c971539d9f8a" ),
  "createdAt" : Date( 1339964775466 ),
  "points" : 200,
  "profile" : null,
  "userId" : "10002"
}
4

2 に答える 2

5

これは、日ごとのカウントデータで機能します

私が得た出力:

30/3/2016   4
26/3/2016   4
21/3/2016   4
12/3/2016   12
14/3/2016   18
10/3/2016   10
9/3/2016    11
8/3/2016    19
7/3/2016    21

脚本:

model.aggregate({
  $match: {
    createdAt: {
      $gte: new Date("2016-01-01")
    } 
  } 
}, { 
  $group: {
    _id: { 
      "year":  { "$year": "$createdAt" },
      "month": { "$month": "$createdAt" },
      "day":   { "$dayOfMonth": "$createdAt" }
    },
    count:{$sum: 1}
  }
}).exec(function(err,data){
  if (err) {
    console.log('Error Fetching model');
    console.log(err);
  } else {
    console.log(data);
  }
});
于 2016-03-31T07:17:45.157 に答える
4

パフォーマンスの順に、いくつかのオプションがあります。

  1. 別の集計ドキュメントでカウントを維持します。ユーザーを追加するたびに、その日のカウンターを更新します (つまり、users.daycounters コレクションなどに、それぞれの日ごとに固有のカウンター ドキュメントがあります)。これは簡単に最速のアプローチであり、最適なスケーリングです。
  2. 2.2 以降では、集約フレームワークを使用できます。ユースケースに近い例は、ここに記載されています。$group 演算子を探します: http://docs.mongodb.org/manual/applications/aggregation/
  3. map/reduce フレームワークを使用できます: http://www.mongodb.org/display/DOCS/MapReduce。これはシャーディングと互換性がありますが、JavaScript コンテキストの使用により比較的低速です。また、このような単純なものはあまり簡単ではありません。
  4. ここに記載されている group() 演算子を使用できます: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group。これはシャード環境では機能せず、シングル スレッドの JavaScript コンテキストを使用するために一般的に低速であるため、これはお勧めできません。
于 2012-10-12T13:24:17.727 に答える