牛骨文教育服务平台(让学习变的简单)
博文笔记

MongoDB从不懂到装懂其二(C#操作MongoDB)

创建时间:2016-07-13 投稿人: 浏览次数:4055


上一篇文档讲述了在命令窗口下的MongoDB的相关操作,这一篇讲述C#语言环境下MongoDB的使用。


先附上实例代码:http://download.csdn.net/detail/sinat_22013331/9575331

注意在运行这个例子的时候,首先要按照例子中的数据库名称和表单名称来新建数据库和表单。同时开启数据库服务器。



具体使用时,先要下载MongoDB驱动文件,下载地址是:https://github.com/mongodb/mongo-csharp-driver/releases

驱动下载之后,在文件中添加引用就行了。下面详细讲解使用方法。


step 1:数据库基本设置,获取数据库和数据库服务器实例


这里可以新建一个类,专门用来放置数据库的一些设置细节。如下所示,每一条语句的作用都作了说明。

    internal sealed class MongoDB
    {
        //数据库所在主机的端口
        private readonly int MONGO_CONN_PORT = 27017;

        //设置连接超时15秒
        private readonly int CONNECT_TIME_OUT = 15;

        //设置最大连接数
        private readonly int MAXConnectionPoolSize = 99;

        //设置最小连接数
        private readonly int MINConnectionPoolSize = 1;

        /// <summary>
        /// 获得数据库实例
        /// </summary>
        /// <param name="MONGO_CONN_HOST">数据库主机链接</param>
        /// <param name="DB_Name">数据库名称</param>
        /// <returns>数据库实例</returns>
        public MongoDatabase GetDataBase(string MONGO_CONN_HOST, string DB_Name)
        {
            MongoClientSettings mongoSetting = new MongoClientSettings();

            mongoSetting.ConnectTimeout = new TimeSpan(CONNECT_TIME_OUT * TimeSpan.TicksPerSecond);  //设置超时连接

            mongoSetting.Server = new MongoServerAddress(MONGO_CONN_HOST, MONGO_CONN_PORT);  //设置数据库服务器

            mongoSetting.MaxConnectionPoolSize = MAXConnectionPoolSize;  //设置最大连接数
            mongoSetting.MinConnectionPoolSize = MINConnectionPoolSize;  //设置最小连接数

            MongoClient client = new MongoClient(mongoSetting);  //创建Mongo客户端

            return client.GetServer().GetDatabase(DB_Name);  //得到服务器端并生成数据库实例
        }


        /// <summary>
        /// 得到数据库服务器
        /// </summary>
        /// <param name="MONGO_CONN_HOST">数据库主机链接</param>
        /// <returns>数据库服务器实例</returns>
        public MongoServer GetDataBaseServer(string MONGO_CONN_HOST)
        {
            MongoClientSettings mongoSetting = new MongoClientSettings();

            mongoSetting.ConnectTimeout = new TimeSpan(CONNECT_TIME_OUT * TimeSpan.TicksPerSecond);  //设置超时连接

            mongoSetting.Server = new MongoServerAddress(MONGO_CONN_HOST, MONGO_CONN_PORT);  //设置数据库服务器

            mongoSetting.MaxConnectionPoolSize = MAXConnectionPoolSize;  //设置最大连接数
            mongoSetting.MinConnectionPoolSize = MINConnectionPoolSize;  //设置最小连接数

            MongoClient client = new MongoClient(mongoSetting);  //创建MongoDB客户端

            return client.GetServer();
        }
    }



step 2:创建一个MongoDBHelper文件,用于实例化数据库,同时进行增删改查的相关方法实现


首先是实例的创建,定义数据库实例和数据库服务器实例,在构造函数中完成创建

        /// <summary>
        /// 数据库的实例
        /// </summary>
        public MongoDatabase _db;
        
        /// <summary>
        /// 得到数据库服务器
        /// </summary>
        private MongoServer _dbServer;

        /// <summary>
        /// ObjectId的键
        /// </summary>
        private readonly string OBJECTID_KEY = "_id";

        //初始化构造函数
        public MongoDBHelper(string MONGO_CONN_HOST, string DB_Name)
        {
            this._db = new MongoDB().GetDataBase(MONGO_CONN_HOST, DB_Name);
            this._dbServer = new MongoDB().GetDataBaseServer(MONGO_CONN_HOST);
        }



接下来讨论增删改查方法的实现,首先是插入数据,插入数据分为单条插入和批量插入。批量插入的时候直接使用List类型。这里需要注意的是类型T。这个类型可以是基本数据类型,包括String,int,List,Dictionary,HashSet等,也可以是预定义的数据类型

        /// <summary>
        /// 将数据插入进数据库
        /// </summary>
        /// <typeparam name="T">需要插入数据库的实体类型</typeparam>
        /// <param name="t">需要插入数据库的具体实体</param>
        /// <param name="collectionName">指定插入的集合</param>
        public void Insert<T>(T t, string collectionName)
        {
            MongoCollection<BsonDocument> mc = this._db.GetCollection<BsonDocument>(collectionName);

            //将实体转换为bson文档
            BsonDocument bd = t.ToBsonDocument();

            //进行插入操作
            WriteConcernResult result = mc.Insert(bd);
            if (!string.IsNullOrEmpty(result.ErrorMessage))
            {
                throw new Exception(result.ErrorMessage);
            }

        }

        /// <summary>
        /// 批量插入数据
        /// </summary>
        /// <typeparam name="T">需要插入数据库的实体类型</typeparam>
        /// <param name="list">需要插入数据的列表</param>
        /// <param name="collectionName">指定要插入的集合</param>
        public void Insert<T>(List<T> list, string collectionName)
        {
            MongoCollection<BsonDocument> mc = this._db.GetCollection<BsonDocument>(collectionName);
            
            //创建一个空间bson集合
            List<BsonDocument> bsonList = new List<BsonDocument>();
            
            //批量将数据转为bson格式 并且放进bson文档,lambda表达式
            list.ForEach(t => bsonList.Add(t.ToBsonDocument()));
            
            //批量插入数据
            mc.InsertBatch(bsonList);
        }


删除数据的操作,可以分为按照查找条件删除和全部删除

        /// <summary>
        /// 移除指定的数据
        /// </summary>
        /// <typeparam name="T">移除的数据类型</typeparam>
        /// <param name="query">移除的数据条件</param>
        /// <param name="collectionName">指定的集合名词</param>
        public void Remove<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);

            query = this.InitQuery(query);
            //根据指定查询移除数据
            mc.Remove(query);
        }

        /// <summary>
        /// 移除实体里面所有的数据
        /// </summary>
        /// <typeparam name="T">移除的数据类型</typeparam>
        /// <param name="collectionName">指定的集合名称</param>
        public void RemoveAll<T>(string collectionName)
        {
            this.Remove<T>(null, collectionName);
        }


查找数据的操作比较多一些,因为在读库的时候也比较常用。这里给出几个方法,分别是:查找数据库中所有记录,按条件查找多个记录,按条件查找一个记录(第一个找到的) 以及查找指定字段的记录

        /// <summary>
        /// 查询一个集合中的所有数据
        /// </summary>
        /// <typeparam name="T">该集合数据的所属类型</typeparam>
        /// <param name="collectionName">指定集合的名称</param>
        /// <returns>返回一个List列表</returns>
        public List<T> FindAll<T>(string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            //以实体方式取出其数据集合
            MongoCursor<T> mongoCursor = mc.FindAll();
            //直接转化为List返回
            return mongoCursor.ToList<T>();
        }



        /// <summary>
        /// 查询指定字段的所有数据
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="collectionName">数据表名称</param>
        /// <param name="fd">字段区间定义</param>
        /// <returns></returns>
        public List<T> FindAll<T>(string collectionName, FieldsDocument fd)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            //以实体方式取出其数据集合
            MongoCursor<T> mongoCursor = mc.FindAll().SetFields(fd);
            //直接转化为List返回
            return mongoCursor.ToList<T>();
        }




        /// <summary>
        /// 查询一条记录
        /// </summary>
        /// <typeparam name="T">该数据所属的类型</typeparam>
        /// <param name="query">查询的条件 可以为空</param>
        /// <param name="collectionName">去指定查询的集合</param>
        /// <returns>返回一个实体类型</returns>
        public T FindOne<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);
            T t = mc.FindOne(query);
            return t;
        }

        /// <summary>
        /// 根据指定条件查询集合中的多条数据记录
        /// </summary>
        /// <typeparam name="T">该集合数据的所属类型</typeparam>
        /// <param name="query">指定的查询条件 比如Query.And(Query.EQ("username","admin"),Query.EQ("password":"admin"))</param>
        /// <param name="collectionName">指定的集合的名称</param>
        /// <returns>返回一个List列表</returns>
        public List<T> Find<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);

            MongoCursor<T> mongoCursor = mc.Find(query);

            return mongoCursor.ToList<T>();
        }

最后,来说一下更新数据的操作,更新比较简单,这里给出一种更新方法

        /// <summary>
        /// 更新数据
        /// </summary>
        /// <typeparam name="T">更新的数据 所属的类型</typeparam>
        /// <param name="query">更新数据的查询</param>
        /// <param name="update">需要更新的文档</param>
        /// <param name="collectionName">指定更新集合的名称</param>
        public void Update<T>(IMongoQuery query, BsonDocument bd, string collectionName)
        {

            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);

            mc.Update(query, new UpdateDocument(bd));
        }


当然,还有一些其他的方法,比如说获取数据库集合大小,增加数据库索引等操作,详见上面贴出来的例子里的代码吧。










声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。