2017-01-14 24 views
0

C#MongoDbドライバを使用しています。日付でグループ化するデータ

システムに最後にログインしたログインコレクションがあります。

最後の24時間と最後の1時間の2つのグループにグループ化したいと思います。

オブジェクトは、以下のようになります。

public sealed class Login 
{ 
    [BsonId] 
    public ObjectId UserId; 
    public DateTime LastLogin; 
} 

各ユーザーに、あなたは差し引くこととして、1行のみを持っています。私は集計経験がないし、アイブ氏は、ウィキで見られる例のすべてが共通のフィールドをグループ化するには、すべてだった私は持っていけないので、ここで私は、データ操作を持って

{ 
"Id" : "24Hours", "Count" : <some number>, 
"Id" : "LastHour", "Count" : <some other number> 
} 

期待される結果は次のようになります道具。

Aggregateの代わりにAggregateAsyncを使用できるといいですね。

答えて

1

私はこれをAggregationフレームワークで管理しています。私ができなかったのは、ログインが24時間以内であれば、私は余分なSelectでそれをしました。

最初にログインしたのは過去24時間以内かどうか(true/false)に基づいて結果をグループ化するよりも過去24時間以内に得られます。以前に説明した。

var result = 
    collection.Aggregate() 
     .Match(x => x.LastLogin >= DateTime.Now.AddDays(-1) && x.LastLogin <= DateTime.Now) 
     .Group(r => r.LastLogin <= DateTime.Now.AddHours(-1), r => 
         new { WithinLastHour = r.Key , Count = r.Count()}) 
     .ToEnumerable() 
     .Select(x=> 
       new {Name = x.WithinLastHour ? "Within last hour":"Within last 24 hours", 
        x.Count}) 
     .ToList(); 

確かにあなたがしたい場合、あなたはAggregateAsyncを行うことができます。

1

私はこのようなC#で投影し、gtoupを使用することができます。

var yesterday = DateTime.Now.AddDays(-1); 
var lastHour = DateTime.Now.AddHours(-1); 

var projection = new BsonDocument 
{ 
    { 
     "Last24Hours", 
     new BsonDocument("$cond", 
      new BsonArray {new BsonDocument("$gte", new BsonArray {"$LastLogin", yesterday}), 1, 0}) 
    }, 
    { 
     "LastHour", 
     new BsonDocument("$cond", 
      new BsonArray {new BsonDocument("$gte", new BsonArray {"$LastLogin", lastHour}), 1, 0}) 
    } 
}; 

var groupBy = new BsonDocument 
{ 
    {"_id", BsonNull.Value}, 
    {"CountLast24Hours", new BsonDocument("$sum", "$Last24Hours")}, 
    {"CountLastHour", new BsonDocument("$sum", "$LastHour")} 
}; 

そして、このようなパイプラインを使用して結果を取得:

var pipeline = PipelineDefinition<Login, BsonDocument>.Create(
    new BsonDocument("$project", projection), 
    new BsonDocument("$group", groupBy), 
    ); 
var result = col.Aggregate(pipeline).SingleOrDefault(); 

var countLast24Hours = result["CountLast24Hours"].AsInt32; 
var countLastHour = result["CountLastHour"].AsInt32; 
関連する問題