• 8天学通MongoDB——第八天 驱动实践


    作为系列的最后一篇,得要说说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。

    复制代码
     1 #region 数据实体
    2 /// <summary>
    3 /// 数据实体
    4 /// </summary>
    5 public class Person
    6 {
    7 [MongoAlias("_id")]
    8 public string ID { get; set; }
    9
    10 public string Name { get; set; }
    11
    12 public int Age { get; set; }
    13
    14 public DateTime CreateTime { get; set; }
    15 }
    16 #endregion
    复制代码


    2:初始化一些变量

    复制代码
     1         string connectionString = string.Empty;
    2
    3 string databaseName = string.Empty;
    4
    5 string collectionName = string.Empty;
    6
    7 static MongodbHelper<T> mongodb;
    8
    9 #region 初始化操作
    10 /// <summary>
    11 /// 初始化操作
    12 /// </summary>
    13 public MongodbHelper()
    14 {
    15 connectionString = "Server=127.0.0.1:2222";
    16 databaseName = "shopex";
    17 collectionName = "person";
    18 }
    19 #endregion
    复制代码

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

    复制代码
     1 #region 实现linq查询的映射配置
    2 /// <summary>
    3 /// 实现linq查询的映射配置
    4 /// </summary>
    5 public MongoConfiguration configuration
    6 {
    7 get
    8 {
    9 var config = new MongoConfigurationBuilder();
    10
    11 config.Mapping(mapping =>
    12 {
    13 mapping.DefaultProfile(profile =>
    14 {
    15 profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
    16 });
    17 mapping.Map<T>();
    18 mapping.Map<T>();
    19 });
    20
    21 config.ConnectionString(connectionString);
    22
    23 return config.BuildConfiguration();
    24 }
    25 }
    26 #endregion
    复制代码

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

    复制代码
      1     #region 插入操作
    2 /// <summary>
    3 /// 插入操作
    4 /// </summary>
    5 /// <param name="person"></param>
    6 /// <returns></returns>
    7 public void Insert(T t)
    8 {
    9 using (Mongo mongo = new Mongo(configuration))
    10 {
    11 try
    12 {
    13 mongo.Connect();
    14
    15 var db = mongo.GetDatabase(databaseName);
    16
    17 var collection = db.GetCollection<T>(collectionName);
    18
    19 collection.Insert(t, true);
    20
    21 mongo.Disconnect();
    22
    23 }
    24 catch (Exception)
    25 {
    26 mongo.Disconnect();
    27 throw;
    28 }
    29 }
    30 }
    31 #endregion
    32
    33 #region 更新操作
    34 /// <summary>
    35 /// 更新操作
    36 /// </summary>
    37 /// <param name="person"></param>
    38 /// <returns></returns>
    39 public void Update(T t, Expression<Func<T, bool>> func)
    40 {
    41 using (Mongo mongo = new Mongo(configuration))
    42 {
    43 try
    44 {
    45 mongo.Connect();
    46
    47 var db = mongo.GetDatabase(databaseName);
    48
    49 var collection = db.GetCollection<T>(collectionName);
    50
    51 collection.Update<T>(t, func, true);
    52
    53 mongo.Disconnect();
    54
    55 }
    56 catch (Exception)
    57 {
    58 mongo.Disconnect();
    59 throw;
    60 }
    61 }
    62 }
    63 #endregion
    64
    65 #region 获取集合
    66 /// <summary>
    67 ///获取集合
    68 /// </summary>
    69 /// <param name="person"></param>
    70 /// <returns></returns>
    71 public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
    72 {
    73 pageCount = 0;
    74
    75 using (Mongo mongo = new Mongo(configuration))
    76 {
    77 try
    78 {
    79 mongo.Connect();
    80
    81 var db = mongo.GetDatabase(databaseName);
    82
    83 var collection = db.GetCollection<T>(collectionName);
    84
    85 pageCount = Convert.ToInt32(collection.Count());
    86
    87 var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
    88 .Take(pageSize).Select(i => i).ToList();
    89
    90 mongo.Disconnect();
    91
    92 return personList;
    93
    94 }
    95 catch (Exception)
    96 {
    97 mongo.Disconnect();
    98 throw;
    99 }
    100 }
    101 }
    102 #endregion
    103
    104 #region 读取单条记录
    105 /// <summary>
    106 ///读取单条记录
    107 /// </summary>
    108 /// <param name="person"></param>
    109 /// <returns></returns>
    110 public T Single(Expression<Func<T, bool>> func)
    111 {
    112 using (Mongo mongo = new Mongo(configuration))
    113 {
    114 try
    115 {
    116 mongo.Connect();
    117
    118 var db = mongo.GetDatabase(databaseName);
    119
    120 var collection = db.GetCollection<T>(collectionName);
    121
    122 var single = collection.Linq().FirstOrDefault(func);
    123
    124 mongo.Disconnect();
    125
    126 return single;
    127
    128 }
    129 catch (Exception)
    130 {
    131 mongo.Disconnect();
    132 throw;
    133 }
    134 }
    135 }
    136 #endregion
    137
    138 #region 删除操作
    139 /// <summary>
    140 /// 删除操作
    141 /// </summary>
    142 /// <param name="person"></param>
    143 /// <returns></returns>
    144 public void Delete(Expression<Func<T, bool>> func)
    145 {
    146 using (Mongo mongo = new Mongo(configuration))
    147 {
    148 try
    149 {
    150 mongo.Connect();
    151
    152 var db = mongo.GetDatabase(databaseName);
    153
    154 var collection = db.GetCollection<T>(collectionName);
    155
    156 //这个地方要注意,一定要加上T参数,否则会当作object类型处理
    157 //导致删除失败
    158 collection.Remove<T>(func);
    159
    160 mongo.Disconnect();
    161
    162 }
    163 catch (Exception)
    164 {
    165 mongo.Disconnect();
    166 throw;
    167 }
    168 }
    169 }
    170 #endregion
    复制代码



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

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

     <1> Add:

    复制代码
     1    static void Main(string[] args)
    2 {
    3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
    4
    5 //插入1000条数据
    6 for (int i = 0; i < 1000; i++)
    7 {
    8 helper.Insert(new Person()
    9 {
    10 ID = Guid.NewGuid().ToString(),
    11 Name = "jack" + i,
    12 Age = i,
    13 CreateTime = DateTime.Now
    14 });
    15 }
    16
    17 Console.WriteLine("插入成功");
    18
    19 Console.Read();
    20 }
    复制代码

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

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

    复制代码
     1  static void Main(string[] args)
    2 {
    3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
    4
    5 //修改jack941改成mary
    6 var single = helper.Single(i => i.Name == "jack941");
    7 single.Name = "mary";
    8 helper.Update(single, i => i.ID == single.ID);
    9
    10 Console.WriteLine("修改成功");
    11 Console.Read();
    12 }
    复制代码

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

    复制代码
     1      static void Main(string[] args)
    2 {
    3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
    4
    5 //删除mary这个记录
    6 helper.Delete(i => i.Name == "mary");
    7
    8 Console.WriteLine("删除成功");
    9 Console.Read();
    10 }
    复制代码


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

    复制代码
     1    static void Main(string[] args)
    2 {
    3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
    4
    5 int pagecount;
    6
    7 //获取名字里面带9的人数
    8 var list = helper.List(1, 20, i => i.Name.Contains("9"), out pagecount);
    9
    10 Console.Read();
    11 }
    复制代码

    总的运行代码

    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
    }
    

      

    趁着3天的休假,不断的努力终于把这个系列写完了,很感谢一直关注此系列的朋友。

  • 相关阅读:
    【Golang】 关于Go 并发之三种线程安全的 map
    Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验
    Logstash优化吞吐率
    ES集群状态yellow修复
    ES集群状态red修复
    vxetable 导出Excel 超过100条,自定义模板template替换失效
    [转]使用minio搭建自己的文件存储服务(新版和旧版)
    [转]vue 预览pdf,txt
    windows7 使用nvs升级降级node.js版本
    新建Token来访问K8S apiserver
  • 原文地址:https://www.cnblogs.com/timssd/p/4185294.html
Copyright © 2020-2023  润新知