zoukankan      html  css  js  c++  java
  • C#操作MongoDB数据库方法

        本文利用MongoDB官方发布的C#驱动,封闭了对MongoDB数据库的增删改查访问方法。

        1、引用MongoDB for C# Driver

        从网上下载C#访问MongoDB的驱动,得到两个DLL:

    • MongoDB.Driver.dll
    • MongoDB.Bson.dll

        将它们引用到项目中。

        2、编写数据库访问帮助类

        编写MongoDB访问帮助类MongoDbHelper:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using MongoDB.Bson;
      5 using MongoDB.Driver;
      6 using MongoDB.Driver.Builders;
      7 using MongoDbTest.Models;
      8 
      9 namespace MongoDbTest
     10 {
     11     /// <summary>
     12     /// MongoDB帮助类
     13     /// </summary>
     14     internal static class MongoDbHepler
     15     {
     16         /// <summary>
     17         /// 获取数据库实例对象
     18         /// </summary>
     19         /// <param name="connectionString">数据库连接串</param>
     20         /// <param name="dbName">数据库名称</param>
     21         /// <returns>数据库实例对象</returns>
     22         private static MongoDatabase GetDatabase(string connectionString, string dbName)
     23         {
     24             var server = MongoServer.Create(connectionString);
     25             return server.GetDatabase(dbName);
     26         }
     27 
     28         #region 新增
     29 
     30         /// <summary>
     31         /// 插入一条记录
     32         /// </summary>
     33         /// <typeparam name="T">数据类型</typeparam>
     34         /// <param name="connectionString">数据库连接串</param>
     35         /// <param name="dbName">数据名称</param>
     36         /// <param name="collectionName">集合名称</param>
     37         /// <param name="model">数据对象</param>
     38         public static void Insert<T>(string connectionString, string dbName, string collectionName, T model) where T : EntityBase
     39         {
     40             if (model == null)
     41             {
     42                 throw new ArgumentNullException("model", "待插入数据不能为空");
     43             }
     44             var db = GetDatabase(connectionString, dbName);
     45             var collection = db.GetCollection<T>(collectionName);
     46             collection.Insert(model);
     47         }
     48 
     49         #endregion
     50 
     51         #region 更新
     52 
     53         /// <summary>
     54         /// 更新数据
     55         /// </summary>
     56         /// <param name="connectionString">数据库连接串</param>
     57         /// <param name="dbName">数据库名称</param>
     58         /// <param name="collectionName">集合名称</param>
     59         /// <param name="query">查询条件</param>
     60         /// <param name="dictUpdate">更新字段</param>
     61         public static void Update(string connectionString, string dbName, string collectionName, IMongoQuery query, Dictionary<string, BsonValue> dictUpdate)
     62         {
     63             var db = GetDatabase(connectionString, dbName);
     64             var collection = db.GetCollection(collectionName);
     65             var update = new UpdateBuilder();
     66             if (dictUpdate != null && dictUpdate.Count > 0)
     67             {
     68                 foreach (var item in dictUpdate)
     69                 {
     70                     update.Set(item.Key, item.Value);
     71                 }
     72             }
     73             var d = collection.Update(query, update, UpdateFlags.Multi);
     74         }
     75 
     76         #endregion
     77 
     78         #region 查询
     79 
     80         /// <summary>
     81         /// 根据ID获取数据对象
     82         /// </summary>
     83         /// <typeparam name="T">数据类型</typeparam>
     84         /// <param name="connectionString">数据库连接串</param>
     85         /// <param name="dbName">数据库名称</param>
     86         /// <param name="collectionName">集合名称</param>
     87         /// <param name="id">ID</param>
     88         /// <returns>数据对象</returns>
     89         public static T GetById<T>(string connectionString, string dbName, string collectionName, ObjectId id)
     90             where T : EntityBase
     91         {
     92             var db = GetDatabase(connectionString, dbName);
     93             var collection = db.GetCollection<T>(collectionName);
     94             return collection.FindOneById(id);
     95         }
     96 
     97         /// <summary>
     98         /// 根据查询条件获取一条数据
     99         /// </summary>
    100         /// <typeparam name="T">数据类型</typeparam>
    101         /// <param name="connectionString">数据库连接串</param>
    102         /// <param name="dbName">数据库名称</param>
    103         /// <param name="collectionName">集合名称</param>
    104         /// <param name="query">查询条件</param>
    105         /// <returns>数据对象</returns>
    106         public static T GetOneByCondition<T>(string connectionString, string dbName, string collectionName, IMongoQuery query)
    107             where T : EntityBase
    108         {
    109             var db = GetDatabase(connectionString, dbName);
    110             var collection = db.GetCollection<T>(collectionName);
    111             return collection.FindOne(query);
    112         }
    113 
    114         /// <summary>
    115         /// 根据查询条件获取多条数据
    116         /// </summary>
    117         /// <typeparam name="T">数据类型</typeparam>
    118         /// <param name="connectionString">数据库连接串</param>
    119         /// <param name="dbName">数据库名称</param>
    120         /// <param name="collectionName">集合名称</param>
    121         /// <param name="query">查询条件</param>
    122         /// <returns>数据对象集合</returns>
    123         public static List<T> GetManyByCondition<T>(string connectionString, string dbName, string collectionName, IMongoQuery query)
    124             where T : EntityBase
    125         {
    126             var db = GetDatabase(connectionString, dbName);
    127             var collection = db.GetCollection<T>(collectionName);
    128             return collection.Find(query).ToList();
    129         }
    130 
    131         /// <summary>
    132         /// 根据集合中的所有数据
    133         /// </summary>
    134         /// <typeparam name="T">数据类型</typeparam>
    135         /// <param name="connectionString">数据库连接串</param>
    136         /// <param name="dbName">数据库名称</param>
    137         /// <param name="collectionName">集合名称</param>
    138         /// <returns>数据对象集合</returns>
    139         public static List<T> GetAll<T>(string connectionString, string dbName, string collectionName)
    140             where T : EntityBase
    141         {
    142             var db = GetDatabase(connectionString, dbName);
    143             var collection = db.GetCollection<T>(collectionName);
    144             return collection.FindAll().ToList();
    145         }
    146 
    147         #endregion
    148 
    149         #region 删除
    150 
    151         /// <summary>
    152         /// 删除集合中符合条件的数据
    153         /// </summary>
    154         /// <param name="connectionString">数据库连接串</param>
    155         /// <param name="dbName">数据库名称</param>
    156         /// <param name="collectionName">集合名称</param>
    157         /// <param name="query">查询条件</param>
    158         public static void DeleteByCondition(string connectionString, string dbName, string collectionName, IMongoQuery query)
    159         {
    160             var db = GetDatabase(connectionString, dbName);
    161             var collection = db.GetCollection(collectionName);
    162             collection.Remove(query);
    163         }
    164 
    165         /// <summary>
    166         /// 删除集合中的所有数据
    167         /// </summary>
    168         /// <param name="connectionString">数据库连接串</param>
    169         /// <param name="dbName">数据库名称</param>
    170         /// <param name="collectionName">集合名称</param>
    171         public static void DeleteAll(string connectionString, string dbName, string collectionName)
    172         {
    173             var db = GetDatabase(connectionString, dbName);
    174             var collection = db.GetCollection(collectionName);
    175             collection.RemoveAll();
    176         }
    177 
    178         #endregion
    179 
    180     }
    181 }
    View Code

        3、编写测试类

        (1)配置数据库参数

        在配置文件中编写数据库连接串和数据库名称。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <!--MongoDB数据库连接串-->
        <add key="MongoDBConn" value="mongodb://127.0.0.1:27017"/>
        <!--MongoDB数据库名称-->
        <add key="MongoDBName" value="mydb"/>
      </appSettings> 
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    </configuration>
    View Code

        将其写入C#代码中:

    using System.Configuration;
    
    namespace MongoDbTest
    {
        /// <summary>
        /// 数据库配置参数
        /// </summary>
        internal static class DbConfigParams
        {
            private static string _conntionString = ConfigurationManager.AppSettings["MongoDBConn"];
    
            /// <summary>
            /// 获取 数据库连接串
            /// </summary>
            public static string ConntionString
            {
                get { return _conntionString; }
            }
    
            private static string _dbName = ConfigurationManager.AppSettings["MongoDBName"];
    
            /// <summary>
            /// 获取 数据库名称
            /// </summary>
            public static string DbName
            {
                get { return _dbName; }
            }
        }
    }
    View Code

        另外,将集合名称写到C#代码中作为字符串常量:

    namespace MongoDbTest
    {
        public class CollectionNames
        {
            public const string User = "User";
    
            public const string Student = "Student";
        }
    }
    View Code

        (2)编写实体类

        首先,编写实体基类,其中含有默认的Id:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    
    namespace MongoDbTest.Models
    {
        /// <summary>
        /// 实体基类
        /// </summary>
        public class EntityBase
        {
            /// <summary>
            /// 主键
            /// </summary>
            [BsonId]
            public ObjectId Id { get; set; }
        }
    }
    View Code

        然后,编写实体类:

    namespace MongoDbTest.Models
    {
        /// <summary>
        /// 学生类
        /// </summary>
        public class Student : EntityBase
        {
            /// <summary>
            /// 获取 姓名
            /// </summary>
            public string Name { get; set; }
    
            /// <summary>
            /// 获取 年龄
            /// </summary>
            public int Age { get; set; }
    
            /// <summary>
            /// 获取 状态
            /// </summary>
            public State State { get; set; }
        }
    }
    View Code

        其中,State枚举类定义如下:

    namespace MongoDbTest.Models
    {
        /// <summary>
        /// 状态
        /// </summary>
        public enum State
        {
            /// <summary>
            /// 全部
            /// </summary>
            All = 0,
    
            /// <summary>
            /// 正常
            /// </summary>
            Normal = 1,
    
            /// <summary>
            /// 未使用
            /// </summary>
            Unused = 2,
        }
    }
    View Code

        (3)编写测试代码

        在主程序中编写测试代码:

      1 using System;
      2 using System.Collections.Generic;
      3 using MongoDB.Bson;
      4 using MongoDB.Driver.Builders;
      5 using MongoDbTest.Models;
      6 
      7 namespace MongoDbTest
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             Console.Title = "Mongo DB Test";
     14             InsertTest();
     15             //QueryTest();
     16             //UpdateTest();
     17             DeleteTest();
     18 
     19             Console.WriteLine("Finish!");
     20 
     21             Console.ReadLine();
     22         }
     23 
     24         /// <summary>
     25         /// 插入数据测试
     26         /// </summary>
     27         static void InsertTest()
     28         {
     29             var random = new Random();
     30             for (var i = 1; i <= 10; i++)
     31             {
     32                 var item = new Student()
     33                 {
     34                     Name = "我的名字" + i,
     35                     Age = random.Next(25, 30),
     36                     State = i%2 == 0 ? State.Normal : State.Unused
     37                 };
     38                 MongoDbHepler.Insert(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.Student, item);
     39             }
     40         }
     41 
     42         /// <summary>
     43         /// 查询测试
     44         /// </summary>
     45         static void QueryTest()
     46         {
     47             var queryBuilder = new QueryBuilder<Student>();
     48             var query = queryBuilder.GTE(x => x.Age, 27);
     49             var ltModel = MongoDbHepler.GetManyByCondition<Student>(DbConfigParams.ConntionString, DbConfigParams.DbName,
     50                 CollectionNames.Student, query);
     51             if (ltModel != null && ltModel.Count > 0)
     52             {
     53                 foreach (var item in ltModel)
     54                 {
     55                     Console.WriteLine("姓名:{0},年龄:{1},状态:{2}",
     56                         item.Name, item.Age, GetStateDesc(item.State));
     57                 }
     58             }
     59         }
     60 
     61         /// <summary>
     62         /// 更新测试
     63         /// </summary>
     64         static void UpdateTest()
     65         {
     66             var queryBuilder = new QueryBuilder<Student>();
     67             var query = queryBuilder.GTE(x => x.Age, 27);
     68             var dictUpdate = new Dictionary<string, BsonValue>();
     69             dictUpdate["State"] = State.Unused;
     70             MongoDbHepler.Update(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.Student, query,
     71                 dictUpdate);
     72         }
     73 
     74         /// <summary>
     75         /// 删除测试
     76         /// </summary>
     77         static void DeleteTest()
     78         {
     79             var queryBuilder = new QueryBuilder<Student>();
     80             var query = queryBuilder.GTE(x => x.Age, 28);
     81             MongoDbHepler.DeleteByCondition(DbConfigParams.ConntionString, DbConfigParams.DbName, CollectionNames.Student, query);
     82         }
     83 
     84         /// <summary>
     85         /// 获取状态描述
     86         /// </summary>
     87         /// <param name="state">状态</param>
     88         /// <returns>状态描述</returns>
     89         static string GetStateDesc(State state)
     90         {
     91             string result = string.Empty;
     92             switch (state)
     93             {
     94                 case State.All:
     95                     result = "全部";
     96                     break;
     97                 case State.Normal:
     98                     result = "正常";
     99                     break;
    100                 case State.Unused:
    101                     result = "未使用";
    102                     break;
    103                 default:
    104                     throw new ArgumentOutOfRangeException("state");
    105             }
    106             return result;
    107         }
    108     }
    109 }
    View Code
  • 相关阅读:
    Web Designer Intern
    Internship UI/UX Web Designer
    HTML / CSS Frontend Software Engineer Internship
    CSS 07 文本
    CSS 06 背景
    CSS 05 尺寸大小
    CSS 04 注释
    CSS 03 选择器
    Why Ancient Greeks are Always Nude
    C#表示空字符
  • 原文地址:https://www.cnblogs.com/huatao/p/4810861.html
Copyright © 2011-2022 走看看