【经验分享】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 > )
{
Collection.InsertMany(t);
}
}
catch (Exception ex)
{
throw new UserFriendlyException(ex.Message);
}
}
public async Task InsertManyAsync(List<T> t)
{
try
{
if (t != null && t.Count > )
{
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 > ;
}
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 > ;
}
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);// 得到集合所有的元素
【经验分享】Mongodb操作类实现CRUD的更多相关文章
- mongodb 操作类
在使用这个类之前,建议先自己去写,把方法都了解了再用,这样你就可以在适当的时候修个此类,另外请自己构建PagerInfo using System; using System.Collections. ...
- [经验分享]C# 操作Windows系统计划任务
背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
适用于app.config与web.config的ConfigUtil读写工具类 之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...
- 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)
近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...
- 对实体类的CRUD操作
--------------------siwuxie095 对实体类的 CRUD 操作 1.创建数据库和表 (1)创建一个 MySQL 连接:mybatis_conn (2)创建一个数据库:myba ...
- 【求建议】毕业之声——信院IT类毕业学子经验分享交流会
一:缘由 在和非常多学子交流,及上课的经历中,发现一个非常普遍的现象:部分大一学生即失去了对学习.对专业的兴趣.有人在迷茫之后奋起直追.从而珍惜利用不多的大学时光努力提高自己.有人在迷茫中沉沦,沉迷于 ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作
http://www.cnblogs.com/wuhuacong/p/3352016.html 在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的 ...
随机推荐
- LeetCode 01 两数之和
链接:https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们 ...
- Hadoop-No.8之时间戳
要获得良好的HBase的模式设计,要正确的理解和使用时间错.在HBase中,时间戳的作用如下所述. 时间戳决定了在put请求修改记录时那些记录更新 时间戳决定了一条记录的多个版本在返回时的排序 时间戳 ...
- Codeforces 838E Convex Countour
题 OvO http://codeforces.com/contest/838/problem/E (IndiaHacks 2nd Elimination 2017 (unofficial, unra ...
- linux命令系列
Linux系统安装node linux安装rz sz命令:yum install lrzsz上传tar包:rz node-v10.15.0-linux-x64.tar.xz将tar包移到上一级目录下: ...
- 51 Nod 1116 K进制下的大数
1116 K进制下的大数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数 ...
- POJ 2109 Power of Cryptography 数学题 double和float精度和范围
Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21354 Accepted: 107 ...
- Linux top常用操作
是否显示task和cpu行:t 是否显示内存信息行:m 切换信息区域单位:E 切换任务区域单位:e 显示各个CPU单独的数据: 按某列排序: M(内存) P(CPU) N(PID) T(TIME+) ...
- beta week 2/2 Scrum立会报告+燃尽图 07
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9959 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名: ...
- 【转】python 输入一个时间,获取这个时间的下一秒
原文:https://blog.csdn.net/l_d_56/article/details/84832198 输入一个时间,获取这个时间的下一秒 PS:下面代码使用于 python 2.7 tim ...
- Python将函数放入模块
函数可以将通用的代码封装起来,便于其他程序或者方法调用.将函数存放在文件中,这个文件被称为模块.将函数存储在独立的模块中,可与其他程序员共享这些文件而不是整个程序. fun.py def say_hi ...