A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈君 金牌黑马   /  2014-9-10 19:31  /  1208 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这篇文章主要介绍了MongoDB入门教程之C#驱动操作实例,即C#中操作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. public string Name { get; set; }
  10. public int Age { get; set; }
  11. public DateTime CreateTime { get; set; }
  12. }
  13. #endregion
复制代码

2:初始化一些变量

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

5. 好,我们开一下2222端口,由于前前篇我已经把这个mongodb做成了服务,现在就直接连过去了,并做一下对Name的索引。
6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。
<1> Add:

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


乍一看显示的数据以为有问题,为什么没有出现jack0或者jack999,不过find的一下后心情舒坦了。
<2> update: 这里就把jack941的名字改掉“mary”

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

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

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

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

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

总的运行代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Configuration;
  6. using System.Linq.Expressions;
  7. using MongoDB.Configuration;
  8. using MongoDB.Linq;
  9. using MongoDB.Attributes;

  10. namespace MongoDB.Test
  11. {
  12. public class MongodbHelper<T> where T : class
  13. {
  14. string connectionString = string.Empty;
  15. string databaseName = string.Empty;
  16. string collectionName = string.Empty;
  17. static MongodbHelper<T> mongodb;
  18. #region 初始化操作
  19. /// <summary>
  20. /// 初始化操作
  21. /// </summary>
  22. public MongodbHelper()
  23. {
  24. connectionString = "Server=127.0.0.1:2222";
  25. databaseName = "shopex";
  26. collectionName = "person";
  27. }
  28. #endregion
  29. #region 实现linq查询的映射配置
  30. /// <summary>
  31. /// 实现linq查询的映射配置
  32. /// </summary>
  33. public MongoConfiguration configuration
  34. {
  35. get
  36. {
  37. var config = new MongoConfigurationBuilder();
  38. config.Mapping(mapping =>
  39. {
  40. mapping.DefaultProfile(profile =>
  41. {
  42. profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
  43. });
  44. mapping.Map<T>();
  45. mapping.Map<T>();
  46. });
  47. config.ConnectionString(connectionString);
  48. return config.BuildConfiguration();
  49. }
  50. }
  51. #endregion
  52. #region 插入操作
  53. /// <summary>
  54. /// 插入操作
  55. /// </summary>
  56. /// <param name="person"></param>
  57. /// <returns></returns>
  58. public void Insert(T t)
  59. {
  60. using (Mongo mongo = new Mongo(configuration))
  61. {
  62. try
  63. {
  64. mongo.Connect();
  65. var db = mongo.GetDatabase(databaseName);
  66. var collection = db.GetCollection<T>(collectionName);
  67. collection.Insert(t, true);
  68. mongo.Disconnect();
  69. }
  70. catch (Exception)
  71. {
  72. mongo.Disconnect();
  73. throw;
  74. }
  75. }
  76. }
  77. #endregion
  78. #region 更新操作
  79. /// <summary>
  80. /// 更新操作
  81. /// </summary>
  82. /// <param name="person"></param>
  83. /// <returns></returns>
  84. public void Update(T t, Expression<Func<T, bool>> func)
  85. {
  86. using (Mongo mongo = new Mongo(configuration))
  87. {
  88. try
  89. {
  90. mongo.Connect();
  91. var db = mongo.GetDatabase(databaseName);
  92. var collection = db.GetCollection<T>(collectionName);
  93. collection.Update<T>(t, func, true);
  94. mongo.Disconnect();
  95. }
  96. catch (Exception)
  97. {
  98. mongo.Disconnect();
  99. throw;
  100. }
  101. }
  102. }
  103. #endregion
  104. #region 获取集合
  105. /// <summary>
  106. ///获取集合
  107. /// </summary>
  108. /// <param name="person"></param>
  109. /// <returns></returns>
  110. public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
  111. {
  112. pageCount = 0;
  113. using (Mongo mongo = new Mongo(configuration))
  114. {
  115. try
  116. {
  117. mongo.Connect();
  118. var db = mongo.GetDatabase(databaseName);
  119. var collection = db.GetCollection<T>(collectionName);
  120. pageCount = Convert.ToInt32(collection.Count());
  121. var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
  122. .Take(pageSize).Select(i => i).ToList();
  123. mongo.Disconnect();
  124. return personList;
  125. }
  126. catch (Exception)
  127. {
  128. mongo.Disconnect();
  129. throw;
  130. }
  131. }
  132. }
  133. #endregion
  134. #region 读取单条记录
  135. /// <summary>
  136. ///读取单条记录
  137. /// </summary>
  138. /// <param name="person"></param>
  139. /// <returns></returns>
  140. public T Single(Expression<Func<T, bool>> func)
  141. {
  142. using (Mongo mongo = new Mongo(configuration))
  143. {
  144. try
  145. {
  146. mongo.Connect();
  147. var db = mongo.GetDatabase(databaseName);
  148. var collection = db.GetCollection<T>(collectionName);
  149. var single = collection.Linq().FirstOrDefault(func);
  150. mongo.Disconnect();
  151. return single;
  152. }
  153. catch (Exception)
  154. {
  155. mongo.Disconnect();
  156. throw;
  157. }
  158. }
  159. }
  160. #endregion
  161. #region 删除操作
  162. /// <summary>
  163. /// 删除操作
  164. /// </summary>
  165. /// <param name="person"></param>
  166. /// <returns></returns>
  167. public void Delete(Expression<Func<T, bool>> func)
  168. {
  169. using (Mongo mongo = new Mongo(configuration))
  170. {
  171. try
  172. {
  173. mongo.Connect();
  174. var db = mongo.GetDatabase(databaseName);
  175. var collection = db.GetCollection<T>(collectionName);
  176. //这个地方要注意,一定要加上T参数,否则会当作object类型处理
  177. //导致删除失败
  178. collection.Remove<T>(func);
  179. mongo.Disconnect();
  180. }
  181. catch (Exception)
  182. {
  183. mongo.Disconnect();
  184. throw;
  185. }
  186. }
  187. }
  188. #endregion
  189. }
  190. #region 数据实体
  191. /// <summary>
  192. /// 数据实体
  193. /// </summary>
  194. public class Person
  195. {
  196. [MongoAlias("_id")]
  197. public string ID { get; set; }
  198. public string Name { get; set; }
  199. public int Age { get; set; }
  200. public DateTime CreateTime { get; set; }
  201. }
  202. #endregion
  203. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马