C#操作MongoDB資料庫方法
阿新 • • 發佈:2018-12-24
編寫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 }
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>
將其寫入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; } } } }
另外,將集合名稱寫到C#程式碼中作為字串常量:
namespace MongoDbTest
{
public class CollectionNames
{
public const string User = "User";
public const string Student = "Student";
}
}
(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; }
}
}
然後,編寫實體類:
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; }
}
}
其中,State列舉類定義如下:
namespace MongoDbTest.Models
{
/// <summary>
/// 狀態
/// </summary>
public enum State
{
/// <summary>
/// 全部
/// </summary>
All = 0,
/// <summary>
/// 正常
/// </summary>
Normal = 1,
/// <summary>
/// 未使用
/// </summary>
Unused = 2,
}
}
(3)編寫測試程式碼 在主程式中編寫測試程式碼:
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 }