【经验分享】Mongodb操作类实现CRUD
时间:2019-10-15
本文章向大家介绍【经验分享】Mongodb操作类实现CRUD,主要包括【经验分享】Mongodb操作类实现CRUD使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.背景
公司项目中在做数据存储时使用到Mongodb,所以想着将Mongodb的操作封装后可供项目中其他成员方便使用。
附上Mongodb的下载地址: 下载
1.Mongodb类 此类主要是用来构造Mongodb数据库实例的。
public class MongoDb { public MongoDb(string host, string DbName, string timeOut) { this.Connect_TimeOut = timeOut; this.Mongo_Conn_Host = host; this.Db_Name = DbName; } /// <summary> /// 数据库所在主机 /// </summary> private readonly string Mongo_Conn_Host; /// <summary> /// 数据库所在主机的端口 /// </summary> private readonly int Mongo_Conn_Port = 27017; //private readonly int Mongo_Conn_Port = 8635; /// <summary> /// 连接超时设置 秒 /// </summary> private readonly string Connect_TimeOut; /// <summary> /// 数据库名称 /// </summary> private readonly string Db_Name; /// <summary> /// 得到数据库实例 /// </summary> /// <returns></returns> public IMongoDatabase GetDataBase() { MongoClientSettings mongoSetting = new MongoClientSettings(); //设置连接超时时间 //mongoSetting.ConnectTimeout = new TimeSpan(int.Parse(Connect_TimeOut) * TimeSpan.TicksPerSecond); mongoSetting.ConnectTimeout = TimeSpan.FromSeconds(1000); //设置数据库服务器 mongoSetting.Server = new MongoServerAddress(Mongo_Conn_Host, Mongo_Conn_Port); //创建Mongo的客户端 MongoClient client = new MongoClient(mongoSetting); //得到服务器端并且生成数据库实例 return client.GetDatabase(Db_Name); } }
2.MongoEntityBase类 包含Mongodb的主键 _id
public class MongoEntityBase { public ObjectId _id { get; set; } }
3.MongodbConfig类,包含Mongodb的连接地址,数据库名称和集合名称
public class MongoDBConfig { public string ConnectionString { get; set; } public string DbName { get; set; } public string CollectionName { get; set; } }
4.MongodbRepository泛型类,传入要操作的对象实现CRUD
public class MongoDbRepository<T>where T : MongoEntityBase { public IMongoCollection<T> Collection { get; private set; } public IMongoDatabase Database { get; private set; } public MongoDbRepository(MongoDBConfig config) { Database = new MongoClient(config.ConnectionString).GetDatabase(config.DbName); Collection = Database.GetCollection<T>(config.CollectionName); } #region +Add 添加一条数据 public void Add(T t) { try { this.Collection.InsertOne(t); } catch (Exception e) { throw e; } } #endregion #region +AddAsync 异步添加一条数据 /// <summary> /// 异步添加一条数据 /// </summary> /// <param name="t">添加的实体</param> /// <param name="host">mongodb连接信息</param> /// <returns></returns> public async Task AddAsync(T t) { try { await Collection.InsertOneAsync(t); } catch (Exception e) { throw e; } } #endregion #region +InsertMany 批量插入 /// <summary> /// 批量插入 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="t">实体集合</param> /// <returns></returns> public void InsertMany(List<T> t) { try { if (t != null && t.Count > 0) { Collection.InsertMany(t); } } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } } public async Task InsertManyAsync(List<T> t) { try { if (t != null && t.Count > 0) { await Collection.InsertManyAsync(t); } } catch (Exception ex) { throw ex; } } #endregion #region +Update 修改一条数据 /// <summary> /// 修改一条数据 /// </summary> /// <param name="t">添加的实体</param> /// <param name="host">mongodb连接信息</param> /// <returns></returns> public ReplaceOneResult UpdateOne(T t) { try { //修改条件 FilterDefinition<T> filter = Builders<T>.Filter.Eq("_id", t._id); //Collection.UpdateOne(filter,Builders<T>.Update) return Collection.ReplaceOne(filter, t, new UpdateOptions { IsUpsert = true }); } catch (Exception ex) { throw ex; } } #endregion #region +UpdateManay 批量修改数据 /// <summary> /// 批量修改数据 /// </summary> /// <param name="dic">要修改的字段</param> /// <param name="host">mongodb连接信息</param> /// <param name="filter">修改条件</param> /// <returns></returns> public UpdateResult UpdateManay(Expression<Func<T, bool>> filter, dynamic modifyFields) { try { var list = new List<UpdateDefinition<T>>(); foreach (PropertyInfo item in modifyFields.GetType().GetProperties()) { if (item.Name.ToLower() == "id") continue; list.Add(Builders<T>.Update.Set(item.Name, item.GetValue(modifyFields))); } return Collection.UpdateMany(filter, Builders<T>.Update.Combine(list)); } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } } #endregion #region Delete 删除一条数据 /// <summary> /// 删除一条数据 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="id">objectId</param> /// <returns></returns> public DeleteResult DeleteOne(ObjectId id) { try { var filter = Builders<T>.Filter.Eq("_id", id); return Collection.DeleteOne(filter); } catch (Exception ex) { throw ex; } } /// <summary> /// 删除一条数据 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="filter">删除条件</param> /// <returns></returns> public DeleteResult DeleteMany(Expression<Func<T, bool>> filter) { try { return Collection.DeleteMany(filter); } catch (Exception ex) { throw ex; } } #endregion #region Count 根据条件获取总数 /// <summary> /// 根据条件获取总数 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="filter">条件</param> /// <returns></returns> public long Count(Expression<Func<T, bool>> filter) { try { return Collection.CountDocuments(filter); } catch (Exception ex) { throw ex; } } #endregion #region FindOne 根据id查询一条数据 /// <summary> /// 根据id查询一条数据 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="id">objectid</param> /// <param name="field">要查询的字段,不写时查询全部</param> /// <returns></returns> public T FindOne(ObjectId id) { try { return Collection.Find(x => x._id == id).FirstOrDefault<T>(); } catch (Exception ex) { throw ex; } } #endregion #region FindList 查询集合 /// <summary> /// 查询集合 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="filter">查询条件</param> /// <param name="field">要查询的字段,不写时查询全部</param> /// <param name="sort">要排序的字段</param> /// <returns></returns> public List<U> FindList<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> select) { try { return Collection.AsQueryable().Where(exp).Select(select).ToList(); } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } } public List<T> FindList(Expression<Func<T, bool>> exp) { try { return Collection.AsQueryable().Where(exp).ToList(); } catch (Exception ex) { throw ex; } } #endregion #region FindListByPage 分页查询集合 /// <summary> /// 分页查询集合 /// </summary> /// <param name="host">mongodb连接信息</param> /// <param name="filter">查询条件</param> /// <param name="pageIndex">当前页</param> /// <param name="pageSize">页容量</param> /// <param name="count">总条数</param> /// <param name="field">要查询的字段,不写时查询全部</param> /// <param name="sort">要排序的字段</param> /// <returns></returns> public List<U> FindListByPage<U>(string field, string dir, Expression<Func<T, bool>> filter, int SkipCount, int pageSize, out long count, Expression<Func<T, U>> select) { try { count = Collection.CountDocuments(filter); var query = Collection.AsQueryable().Where(filter).OrderBy(field, dir); var data = query.Skip(SkipCount).Take(pageSize).Select(select).ToList(); return data; } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } } #endregion public async Task<bool> AnyAsync(Expression<Func<T, bool>> filter) { try { long count = await Collection.CountDocumentsAsync(filter); return count > 0; } catch (Exception ex) { throw new UserFriendlyException(ex.Message); } } public bool Any(string collName, Expression<Func<T, bool>> filter) { try { long count = Collection.CountDocuments(filter); return count > 0; } catch (Exception ex) { throw ex; } } }
5.初始化MongodbHelper
string dbName = "测试CRUD"; string collectionName ="mongdb"; var InventoryHelper = new MongoDbRepository<Customer> (new MongoDBConfig { CollectionName = collectionName, DbName = dbName, ConnectionString ="mongodb://localhost"); var list=InventoryHelper.FindList(x=>true);// 得到集合所有的元素
原文地址:https://www.cnblogs.com/wnxyz8023/p/11678075.html
- 事故记录-过多进程致使CPU卡死
- Flash/Flex学习笔记(54):迷你滚动条ScrollBar
- linux下正向代理/反向代理/透明代理使用说明
- 万达网科年底集体裁员?公司回应仅是业务调整
- 两个四字母域名均以五位数被交易
- Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
- Android Fragment完全解析
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(2)-配置篇
- Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室
- 28家银行用户体验调研报告:洞见银行业的“进化论”
- 性能计数器数据收集服务
- SQL SERVER 内存分配及常见内存问题 DMV查询
- 6 利用Docker .NET应用程序模板制作您的容器应用程序(第2部分)
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android Studio 4.0新特性及升级异常问题的解决方案
- Android Studio 4.0 正式发布在Ubuntu 20.04中安装的方法
- Android Studio 4.0 新功能中的Live Layout Inspector详解
- Android实现滑动刻度尺效果
- Android 仿微信发动态九宫格拖拽、删除功能
- android自定义等级评分圆形进度条
- Android Fragment实现底部通知栏
- Flutter实现局部刷新
- Android自定义条形对比统计图
- Android底部菜单栏(RadioGroup+Fragment)美化
- android自定义环形统计图动画
- 在Android环境下WebView中拦截所有请求并替换URL示例详解
- Android自定义控件横向柱状统计图
- Android处理视图圆角和色彩的工具类
- Flutter之Timer实现短信验证码获取60s倒计时功能的代码