zoukankan      html  css  js  c++  java
  • 转 mongodb c#客户端操作

    作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者,因为提供了丰富的linq操作,相当方便。

    官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads。下载后,还提供了一个酷似msdn的帮助文档。

    samus驱动:https://github.com/samus/mongodb-csharp/downloads。 


    下面就具体看看samus驱动,https://github.com/samus/mongodb-csharp/blob/master/examples/Simple/Main.cs上面提供了一个简单的demo,大体上看看我们就知道怎么玩了。


    一: 实践


    1:我们建立一个Person实体,MongoAlias特性表示取别名,这里的ID值将会覆盖掉数据库自动生成的_id。


     #region 数据实体
         /// <summary>
     /// 数据实体
     /// </summary>
         public class Person
         {
             [MongoAlias("_id")]
             public string ID { get; set; }
     
             public string Name { get; set; }
     
             public int Age { get; set; }
     
             public DateTime CreateTime { get; set; }
         }
         #endregion




    2:初始化一些变量


             string connectionString = string.Empty;
     
             string databaseName = string.Empty;
     
             string collectionName = string.Empty;
     
             static MongodbHelper<T> mongodb;
     
             #region 初始化操作
     /// <summary>
     /// 初始化操作
     /// </summary>
             public MongodbHelper()
             {
                 connectionString = "Server=127.0.0.1:2222";
                 databaseName = "shopex";
                 collectionName = "person";
             }
             #endregion


    3:为了方便T的继承类使用linq功能,我们还需要映射一下。

     #region 实现linq查询的映射配置
            /// <summary>
    /// 实现linq查询的映射配置
    /// </summary>
             public MongoConfiguration configuration
             {
                 get
                 {
                     var config = new MongoConfigurationBuilder();
     
                     config.Mapping(mapping =>
                     {
                         mapping.DefaultProfile(profile =>
                         {
                             profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
                         });
                         mapping.Map<T>();
                         mapping.Map<T>();
                     });
     
                     config.ConnectionString(connectionString);
     
                     return config.BuildConfiguration();
                 }
             }
             #endregion


    4:下面是一些基本的CURD的代码,跟写EF代码很类似,写起来好舒服。


         #region 插入操作
            /// <summary>
    /// 插入操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Insert(T t)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         collection.Insert(t, true);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 更新操作
            /// <summary>
    /// 更新操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Update(T t, Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         collection.Update<T>(t, func, true);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 获取集合
            /// <summary>
    ///获取集合
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
             {
                 pageCount = 0;
     
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         pageCount = Convert.ToInt32(collection.Count());
     
                         var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
                                                        .Take(pageSize).Select(i => i).ToList();
     
                         mongo.Disconnect();
     
                         return personList;
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 读取单条记录
            /// <summary>
    ///读取单条记录
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public T Single(Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         var single = collection.Linq().FirstOrDefault(func);
     
                         mongo.Disconnect();
     
                         return single;
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 删除操作
            /// <summary>
    /// 删除操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Delete(Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                        //这个地方要注意,一定要加上T参数,否则会当作object类型处理
    //导致删除失败
                         collection.Remove<T>(func);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion


    5.   好,我们开一下2222端口,由于前前篇我已经把这个mongodb做成了服务,现在就直接连过去了,并做一下对Name的索引。


    6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。


     <1> Add:


        static void Main(string[] args)
             {
                 MongodbHelper<Person> helper = new MongodbHelper<Person>();
     
                 //插入1000条数据
                 for (int i = 0; i < 1000; i++)
                 {
                     helper.Insert(new Person()
                     {
                         ID = Guid.NewGuid().ToString(),
                         Name = "jack" + i,
                         Age = i,
                         CreateTime = DateTime.Now
                     });
                 }
     
                 Console.WriteLine("插入成功");
     
                 Console.Read();
             }




    乍一看显示的数据以为有问题,为什么没有出现jack0或者jack999,不过find的一下后心情舒坦了。


    <2> update:   这里就把jack941的名字改掉“mary”


      static void Main(string[] args)
             {
                 MongodbHelper<Person> helper = new MongodbHelper<Person>();
     
                 //修改jack941改成mary
                 var single = helper.Single(i => i.Name == "jack941");
                 single.Name = "mary";
                 helper.Update(single, i => i.ID == single.ID);
     
                 Console.WriteLine("修改成功");
                 Console.Read();
             }


    <3>Delete:  删除mary这条记录


          static void Main(string[] args)
             {
                 MongodbHelper<Person> helper = new MongodbHelper<Person>();
     
                 //删除mary这个记录
                 helper.Delete(i => i.Name == "mary");
     
                 Console.WriteLine("删除成功");
                 Console.Read();
             }


    > list操作: 这里我获取一下名字里面带9的人数列表


        static void Main(string[] args)
             {
                 MongodbHelper<Person> helper = new MongodbHelper<Person>();
     
                 int pagecount;
     
                 //获取名字里面带9的人数
                 var list = helper.List(1, 20, i => i.Name.Contains("9"), out pagecount);
     
                Console.Read();
             }


    总的运行代码


     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using System.Configuration;
     using System.Linq.Expressions;
     
     using MongoDB.Configuration;
     using MongoDB.Linq;
     using MongoDB.Attributes;
     
     
     namespace MongoDB.Test
     {
         public class MongodbHelper<T> where T : class
         {
             string connectionString = string.Empty;
     
             string databaseName = string.Empty;
     
             string collectionName = string.Empty;
     
             static MongodbHelper<T> mongodb;
     
             #region 初始化操作
            /// <summary>
    /// 初始化操作
    /// </summary>
             public MongodbHelper()
             {
                 connectionString = "Server=127.0.0.1:2222";
                 databaseName = "shopex";
                 collectionName = "person";
             }
             #endregion
     
             #region 实现linq查询的映射配置
            /// <summary>
    /// 实现linq查询的映射配置
    /// </summary>
             public MongoConfiguration configuration
             {
                 get
                 {
                     var config = new MongoConfigurationBuilder();
     
                     config.Mapping(mapping =>
                     {
                         mapping.DefaultProfile(profile =>
                         {
                             profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
                         });
                         mapping.Map<T>();
                         mapping.Map<T>();
                     });
     
                     config.ConnectionString(connectionString);
     
                     return config.BuildConfiguration();
                 }
             }
             #endregion
     
             #region 插入操作
            /// <summary>
    /// 插入操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Insert(T t)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         collection.Insert(t, true);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 更新操作
            /// <summary>
    /// 更新操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Update(T t, Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         collection.Update<T>(t, func, true);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 获取集合
            /// <summary>
    ///获取集合
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
             {
                 pageCount = 0;
     
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         pageCount = Convert.ToInt32(collection.Count());
     
                         var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
                                                        .Take(pageSize).Select(i => i).ToList();
     
                         mongo.Disconnect();
     
                         return personList;
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 读取单条记录
            /// <summary>
    ///读取单条记录
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public T Single(Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                         var single = collection.Linq().FirstOrDefault(func);
     
                         mongo.Disconnect();
     
                         return single;
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
     
             #region 删除操作
            /// <summary>
    /// 删除操作
    /// </summary>
    /// <param name="person"></param>
    /// <returns></returns>
             public void Delete(Expression<Func<T, bool>> func)
             {
                 using (Mongo mongo = new Mongo(configuration))
                 {
                     try
                     {
                         mongo.Connect();
     
                         var db = mongo.GetDatabase(databaseName);
     
                         var collection = db.GetCollection<T>(collectionName);
     
                        //这个地方要注意,一定要加上T参数,否则会当作object类型处理
    //导致删除失败
                         collection.Remove<T>(func);
     
                         mongo.Disconnect();
     
                     }
                     catch (Exception)
                     {
                         mongo.Disconnect();
                         throw;
                     }
                 }
             }
             #endregion
         }
     
         #region 数据实体
        /// <summary>
    /// 数据实体
    /// </summary>
         public class Person
         {
             [MongoAlias("_id")]
             public string ID { get; set; }
     
             public string Name { get; set; }
             public int Age { get; set; }
     
             public DateTime CreateTime { get; set; }
         }
         #endregion

     }

  • 相关阅读:
    小程序开发系列(五)悬浮搜索框
    LINQ的连接扩展(左连、右连、全连等)
    小程序开发系列(四)九宫格另一种实现
    python 生成随机图片验证码
    django定时任务小插件
    线程池模块thernd
    python logging 模块记录日志
    django Q条件
    jquery 事件绑定
    jQuery示例
  • 原文地址:https://www.cnblogs.com/jiangqw/p/12217262.html
Copyright © 2011-2022 走看看