zoukankan      html  css  js  c++  java
  • 一步步操作mongoDB,增删改查,分页查询 C#

    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

    那么在c#如何使用呢?下面看个例子,你会发现上手非常简单。

    1、新建一个NetCore控制台应用程序

     然后Nuget引用,如下:

    Install-Package MongoDB.Driver -Version 2.11.0
    Install-Package MongoDB.Bson -Version 2.11.0

    然后,新建一个MongoDb的操作类【此操作类用于创建数据库、表,批量插入,查询全部数据等】

    using MongoDB.Driver;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleMongoDb.Helper
    {
        /// <summary>
        /// 这里的T 代表数据表的Model
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class MongoHelper<T>
        {
            public readonly IMongoCollection<T> MongoTb;
    
            public MongoHelper(DatabaseSettings settings)
            {
                var client = new MongoClient(settings.ConnectionString);
                var database = client.GetDatabase(settings.DatabaseName);
                MongoTb = database.GetCollection<T>(settings.LogsCollectionName);
            }
            /// <summary>
            /// 单条插入
            /// </summary>
            /// <param name="book"></param>
            /// <returns></returns>
            public T Create(T book)
            {
                MongoTb.InsertOne(book);
                return book;
            }
            /// <summary>
            /// 批量插入
            /// </summary>
            /// <param name="books"></param>
            /// <returns></returns>
            public List<T> Create(List<T> books)
            {
                MongoTb.InsertMany(books);
                return books;
            }
    
            /// <summary>
            /// 批量查询所有
            /// </summary>
            /// <returns></returns>
            public List<T> Get()
            {
                return MongoTb.Find(book => true).ToList();
            }
        }
    
        public class DatabaseSettings
        {
            public string LogsCollectionName { get; set; } = "TableName";//日志
            public string ConnectionString { get; set; } = "mongodb://127.0.0.1:27017";//连接字符串
            public string DatabaseName { get; set; } = "DbName";
        }
    }
    View Code

    在上述的操作类中,由注释可知,<T> 代表mongoDB的表对象,那么下面我们创建一张mongoDB的表对象【学生表】,如下:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleMongoDb.MongoModel
    {
        /// <summary>
        /// mongoDb数据表实体
        /// </summary>
        public class Student
        {
            [BsonId]
            [BsonRepresentation(BsonType.ObjectId)]
            public string Id { get; set; }
            [BsonElement("StudentName")]
            public string StudentName { get; set; }
            public string StudentSex { get; set; }
            public DateTime CreateDate { get; set; }
        }
    }
    View Code

    为了演示大数据,我们引入一个随机生成姓名的类,如下:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace ConsoleMongoDb.Helper
    {
        public class connonName
        {
            private object O = new object();
            public static List<string> Xing = new List<string>() {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "羿", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "宿", "", "怀", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "寿", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "广", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "",
            "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊",
            "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐",
            "锺离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "丌官", "司寇", "子车", "微生",
            "颛孙", "端木", "巫马", "公西", "漆雕", "乐正", "壤驷", "公良", "拓拔", "夹谷", "宰父", "谷梁",
            "段干", "百里", "东郭", "南门", "呼延", "羊舌", "梁丘", "左丘", "东门", "西门", "南宫"};
    
            static string _lastNameMan = "刚伟勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";
    
    
            static string _lastNameWoMan = "秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝鱼晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽墨";
    
    
    
            public static List<string> GetManName()
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                List<string> NameArray = new List<string>();
                int XingLen = Xing.Count;//501个姓
                char[] ManChar = _lastNameMan.ToCharArray();//151的男士名
                char[] WoManChar = _lastNameWoMan.ToCharArray();//151个女士名
                int ManNameLen = ManChar.Length;//151的男士名
                int WoManNameLen = WoManChar.Length;//151个女士名
                //
                foreach (var item in Xing)
                {
                    foreach (var Ming in ManChar)
                    {
                        NameArray.Add(item + Ming);
                    }
                }
                foreach (var item in Xing)
                {
                    foreach (var Ming in WoManChar)
                    {
                        NameArray.Add(item + Ming);
                    }
                }
                sw.Stop();
                TimeSpan ts2 = sw.Elapsed;
                Console.WriteLine("Parallel.ForEach总共花费{0}ms.", ts2.TotalMilliseconds);
                return NameArray;
            }
        }
    }
    View Code

    然后客户端方法为:

    using ConsoleMongoDb.Helper;
    using ConsoleMongoDb.MongoModel;
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ConsoleMongoDb
    {
        class Program
        {
            /// <summary>
            /// mongoDb会自动判断数据库、数据表是否存在,如果不存在,则创建
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                Console.WriteLine("现在开始创建数据库,数据表,并插入大量数据");
                //创建一个StudentDb数据库,并指定一张待建的表Student,采用默认连接方式,如果不同,请修改
                DatabaseSettings ds = new DatabaseSettings()
                {
                    DatabaseName = "StudentDb",//数据库名
                    LogsCollectionName = "Student"//表名
                };
                MongoHelper<Student> mongo = new MongoHelper<Student>(ds);
                List<string> NameArray = connonName.GetManName();
                List<Student> Lst = new List<Student>();
                for (int i=0;i< NameArray.Count; i++)
                {
                    var student = new Student()
                    {
                        StudentName = NameArray[i],
                        CreateDate = DateTime.Now,
                        StudentSex = (i % 2 == 0 ? "" : "")
                    };
                    Lst.Add(student);
                }
                //批量插入mongodb 
                mongo.Create(Lst);
                Console.WriteLine("插入数据完毕");
                Console.Read();
            }
        }
    }
    View Code

    事实证明:

    mongoDb果然不是盖的,通过上述的程序,一共插入了十几万条数据,总花费大概不到二秒钟,牛逼吧。

    那么,现在我们有了这么十几万条数据,我们就可以安心的进行分页处理了,那么mongodb中分页怎么搞呢?

    首先创建基本的分页类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleMongoDb.Helper
    {
        public static class MongoPaginationService
        {
            /// <summary>
            /// 分页
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="entitys"></param>
            /// <param name="json"></param>
            /// <param name="pagination"></param>
            /// <returns></returns>
            public static IQueryable<T> BasePager<T>(this IOrderedQueryable<T> entitys, ref BasePaginationModel pagination)
            {
                if (pagination != null)
                {
                    var result = entitys.GetBasePagination(pagination);
                    return result;
                }
                return null;
            }
    
            /// <summary>
            /// 获取分页后的数据
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="source">数据源IQueryable</param>
            /// <param name="pagination">分页参数</param>
            /// <returns></returns>
            private static IQueryable<T> GetBasePagination<T>(this IOrderedQueryable<T> source, BasePaginationModel pagination)
            {
                pagination.Total = source.Count();
                return source.Skip((pagination.PageNumber - 1) * pagination.PageSize).Take(pagination.PageSize);
            }
        }
    
        public class PaginationListModel<T>
        {
            public PaginationListModel()
            {
                Data = new List<T>();
            }
            public List<T> Data { get; set; }
            public BasePaginationModel Pagination { get; set; }
        }
    
        public class PaginationModel
        {
            #region 构造函数
    
            public PaginationModel()
            {
                PageNumber = 1;
                PageSize = 10;
            }
    
            #endregion
            /// <summary>
            /// 当前页码
            /// </summary>
            public int PageNumber { get; set; }
    
            /// <summary>
            /// 每页行数
            /// </summary>
            public int PageSize { get; set; }
    
        }
    
        /// <summary>
        /// 基本分页实体类
        /// </summary>
        public class BasePaginationModel
        {
            #region 构造函数
    
            public BasePaginationModel()
            {
                PageNumber = 1;
                PageSize = 10;
            }
    
            #endregion
    
            #region 成员
    
            /// <summary>
            /// 总页数
            /// </summary>
            public int PageCount
            {
                get
                {
                    int pages = Total / PageSize;
                    int pageCount = Total % PageSize == 0 ? pages : pages + 1;
                    return pageCount;
                }
            }
    
            /// <summary>
            /// 当前页码
            /// </summary>
            public int PageNumber { get; set; }
    
            /// <summary>
            /// 每页行数
            /// </summary>
            public int PageSize { get; set; }
    
    
            /// <summary>
            /// 总记录数
            /// </summary>
            public int Total { get; set; }
    
            /// <summary>
            /// 总页数
            /// </summary>
            public int Pages { get => PageCount; }
    
            /// <summary>
            /// 是否首页
            /// </summary>
            public bool IsFirstPage { get => PageNumber == 1; }
    
            /// <summary>
            /// 是否尾页
            /// </summary>
            public bool IsLastPage { get => PageNumber == Pages; }
    
            #endregion
        }
    }
    View Code

    然后我的分页方法为:

            static  PaginationListModel<Student> GetPagination(DatabaseSettings settings,ref BasePaginationModel Pagination)
            {
                var client = new MongoClient(settings.ConnectionString);
                var database = client.GetDatabase(settings.DatabaseName);
                var Mongo = database.GetCollection<Student>(settings.LogsCollectionName);
                var mongorResult = Mongo.AsQueryable<Student>().Where(A => !string.IsNullOrEmpty(A.StudentName)).OrderByDescending(item => item.CreateDate);
                var result = MongoPaginationService.BasePager<Student>(mongorResult, ref Pagination);
                PaginationListModel<Student> M = new PaginationListModel<Student>()
                {
                    Data = result.ToList(),
                    Pagination = Pagination
                };
                return M;
            }

    客户端代码为:

            /// <summary>
            /// mongoDb会自动判断数据库、数据表是否存在,如果不存在,则创建
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                Console.WriteLine("现在开始创建数据库,数据表,并插入大量数据");
                //创建一个StudentDb数据库,并指定一张待建的表Student,采用默认连接方式,如果不同,请修改
                DatabaseSettings ds = new DatabaseSettings()
                {
                    DatabaseName = "StudentDb",//数据库名
                    LogsCollectionName = "Student"//表名
                };
                MongoHelper<Student> mongo = new MongoHelper<Student>(ds);
                List<string> NameArray = connonName.GetManName();
                List<Student> Lst = new List<Student>();
                for (int i=0;i< NameArray.Count; i++)
                {
                    var student = new Student()
                    {
                        StudentName = NameArray[i],
                        CreateDate = DateTime.Now,
                        StudentSex = (i % 2 == 0 ? "" : "")
                    };
                    Lst.Add(student);
                }
                //批量插入mongodb 
                mongo.Create(Lst);
                Console.WriteLine("插入数据完毕");
                //查询并分页
                BasePaginationModel pagination = new BasePaginationModel()
                {
                    PageNumber = 1,
                    PageSize = 100
                };
                var RT = GetPagination(ds, ref pagination);
                Console.WriteLine("当前页码为1,也容量为100,总共有" + RT.Pagination.Total + "条数据,总共分了" + RT.Pagination.PageCount + "页。");
                Console.WriteLine("查询结果为:");
                foreach(var item in RT.Data)
                {
                    Console.WriteLine("学生:" + item.StudentName);
                }
    
                Console.Read();
            }

    OK,我们看下输出的结果:

     可以看到,总共30多万条数据,分了3027页,每页100条数据【每运行一次,就会插入十几万条数据,因此,目前是30多万条数据】。

    以上便是我的分页。

    扩展:

    如何删除数据表数据库呢?

            static void Main(string[] args)
            {
                DatabaseSettings ds = new DatabaseSettings()
                {
                    DatabaseName = "StudentDb",//数据库名
                    LogsCollectionName = "Student"//表名
                };
                //执行删除数据库操作
                var client = new MongoClient(ds.ConnectionString);
                var database = client.GetDatabase(ds.DatabaseName);
                database.DropCollection("Student");//删除数据表
                Console.WriteLine("学生表删除成功");
                database.Client.DropDatabase("StudentDb");
                Console.WriteLine("数据库删除成功");
                Console.Read();
            }

    OK,就这么多吧。

    关于多条件关联查询,MongoDb有自己的一套东东,反正用起来不是那么友好...

    如下:

            /// <summary>
            /// 查询MongoDb 电柜门状态 带有分页
            /// </summary>
            /// <returns></returns>
            public BaseResponse<PaginationListModel<LogsForcloud181DgTb>> QueryDoorStatus(QueryDoorStatusModel data, ref BasePaginationModel Pagination)
            {
                string DbName = "LogstoreDb" + "_" + data.SDate.ToString("yyyyMMdd");
                LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDbnameEnm.DevicePortStatus.ToString(), DatabaseName = DbName };
                var client = new MongoClient(settings.ConnectionString);
                var database = client.GetDatabase(settings.DatabaseName);
               
                var Mongo = database.GetCollection<LogsForcloud181DgTb>(settings.LogsCollectionName);
                //IAsyncCursor<LogsForcloud181DgTb> Tb = null;
                List<FilterDefinition<LogsForcloud181DgTb>> SearchList=new List<FilterDefinition<LogsForcloud181DgTb>>();
                var builder = Builders<LogsForcloud181DgTb>.Filter;
                if (!string.IsNullOrEmpty(data.deviceNum))
                {
                    //等于
                    var filter = builder.Eq("deviceNum", data.deviceNum);
                    SearchList.Add(filter);
                    //Tb = Mongo.Find<LogsForcloud181DgTb>(filter).ToCursor();
                }
                if (data.BeginDate.HasValue)
                {
                    var bDate = Convert.ToDateTime(data.BeginDate).AddHours(-8);
                    //约束条件
                    DateTime startTime = new DateTime(bDate.Year, bDate.Month, bDate.Day, bDate.Hour, bDate.Minute, bDate.Second, DateTimeKind.Utc);
                    //大于等于
                    var filter = builder.Gte("CreateTime", startTime);
                    SearchList.Add(filter);
                }
                if (data.EndDate.HasValue)
                {
                    var eDate = Convert.ToDateTime(data.EndDate).AddHours(-8);
                    //约束条件
                    DateTime endTime = new DateTime(eDate.Year, eDate.Month, eDate.Day, eDate.Hour, eDate.Minute, eDate.Second, DateTimeKind.Utc);
                    //小于等于
                    var filter =  builder.Lte("CreateTime", endTime);
                    SearchList.Add(filter);
                }
                var MongoR = Mongo.Find(Builders<LogsForcloud181DgTb>.Filter.And(SearchList)).ToList();
                var mongorResult = MongoR.AsQueryable<LogsForcloud181DgTb>().Where(A => A.deviceNum == data.deviceNum).OrderByDescending(item => item.CreateTime); ;
               
                var result = MongoPaginationService.BasePager<LogsForcloud181DgTb>(mongorResult, ref Pagination);
                PaginationListModel<LogsForcloud181DgTb> M = new PaginationListModel<LogsForcloud181DgTb>()
                {
                    Data = result.ToList(),
                    Pagination = Pagination
                };
                return CommonBaseResponse.SetResponse<PaginationListModel<LogsForcloud181DgTb>>(M, true);
            }
    View Code

    @天才卧龙的博客

  • 相关阅读:
    Java中四种引用类型
    使用VisualVM查看Java Heap Dump
    Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器
    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    设计模式2---建造者模式(Builder pattern)
    设计模式1---单例模式(Singleton pattern)
    移动端网络优化
    Http请求的 HttpURLConnection 和 HttpClient
    第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化
    Android模块化编程之引用本地的aar
  • 原文地址:https://www.cnblogs.com/chenwolong/p/mongopa.html
Copyright © 2011-2022 走看看