• Mongodb在CSharp里实现Aggregate


    回到目录 

    今天主要用了一个mongodb.driver里的分组,事实上在网上介绍这方面的文章非常少,以至于我在出现问题后,无法找到一个正确的解决方案,最后还是通过异常信息找到的解决方法,所以感觉自己更应该去写一篇关于如何在C#驱动里进行聚合Aggregate的文章!

            /// <summary>
            /// 返回UI消息树
            /// </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();
            }

    注意,目前mongodb for C#这个驱动,在进行Aggregate时,只支持BsonDocument类型,也就是说,你的集合collection也必须返回的是BsonDocument,而实体类型是不可以被认出的,这点要注意.

    也正是如此,所以我们的mongo封装时,别忘记公开一个BsonDocument的对象供聚合使用!

    感谢各位的阅读,希望文章可以帮助大家!

     回到目录

  • 相关阅读:
    不拖控件的asp.net编程方法——第1回
    实习的故事之——第7天
    最近遇到的问题总结!
    实习的故事之——第5天
    asp.net MVC最简单的增删查改!(详)
    实习的故事之——第3天
    如何去除CFormView的Scrollbar
    Mac java环境配置
    【Kafka入门】Kafka基础结构和知识
    [原创]git使用入门
  • 原文地址:https://www.cnblogs.com/lori/p/6864134.html
Copyright © 2020-2023  润新知