Mongodb在CSharp里(li)實現Aggregate
今天主要用了一個(ge)mongodb.driver里(li)的(de)(de)分組,事(shi)實上在(zai)網上介(jie)紹這方(fang)面(mian)的(de)(de)文章非常(chang)少,以至于(yu)我(wo)在(zai)出現問題后,無(wu)法(fa)找到(dao)(dao)一個(ge)正(zheng)確的(de)(de)解決方(fang)案,最后還是通過異常(chang)信息找到(dao)(dao)的(de)(de)解決方(fang)法(fa),所以感覺自己更應該去寫一篇(pian)關(guan)于(yu)如何(he)在(zai)C#驅動里(li)進行聚合Aggregate的(de)(de)文章!
/// <summary> /// 返回UI消息(xi)樹 /// </summary> /// <returns></returns> public static string GetMongoLog(DateTime? fromDate, DateTime? toDate, int page = 1) { string from = DateTime.Now.Date.ToString("yyyy-MM-dd"); string to = DateTime.Now.Date.AddDays(1).ToString("yyyy-MM-dd"); if (fromDate.HasValue) { from = fromDate.Value.ToString("yyyy-MM-dd"); } if (toDate.HasValue) { to = toDate.Value.ToString("yyyy-MM-dd"); } var stages = new List<IPipelineStageDefinition>(); stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{$match:{AddTime:{$gt:ISODate('" + from + "'),$lt:ISODate('" + to + "')}}}")); stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{$group:{_id: \"$RootId\", count: {$sum: 1}}}")); stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{$skip:" + page * 5 + "}")); stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{$limit:5}")); var pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages); var result = NoSql.MongodbManager<LoggerContext>.Collection.Aggregate(pipeline); StringBuilder str = new StringBuilder(); str.Append("<ol class='treeMsg'>"); foreach (var item in result.ToList()) { var timer = new List<DateTime>(); var old = NoSql.MongodbManager<LoggerContext>.Instance.Find(i => i.RootId == item.Values.ToArray()[0].ToString() && i.ParentId == null).FirstOrDefault(); timer.Add(old.AddTime); str.Append("<li style='margin:5px;border:1px dashed #aaa'>"); str.AppendFormat("<span style='color:red;'>{0}</span><span style='color:green'>{1}</span><span>{2}</span>" , old.Url , old.MessageBody , old.AddTime); MsgTree(str, old.ChildId, timer); str.AppendFormat("<p><b><em>本次請求用時{0}毫秒({1}秒)<em></b></p>" , (timer.Max() - timer.Min()).TotalMilliseconds , (timer.Max() - timer.Min()).TotalSeconds); str.Append("</li>"); } str.Append("</ol>"); return str.ToString(); }
注意,目前(qian)mongodb for C#這(zhe)個(ge)驅動(dong),在進行Aggregate時,只(zhi)支持BsonDocument類型,也就是說,你的(de)集合(he)collection也必須返回的(de)是BsonDocument,而實體類型是不可以被(bei)認出(chu)的(de),這(zhe)點(dian)要注意.

也正(zheng)是如(ru)此,所以我們的mongo封(feng)裝時,別忘記(ji)公開(kai)一個BsonDocument的對(dui)象供(gong)聚合使(shi)用!

感謝(xie)各位(wei)的(de)閱讀,希望文章可以幫助(zhu)大家(jia)!