一.背景

公司项目中在做数据存储时使用到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的更多相关文章

  1. mongodb 操作类

    在使用这个类之前,建议先自己去写,把方法都了解了再用,这样你就可以在适当的时候修个此类,另外请自己构建PagerInfo using System; using System.Collections. ...

  2. [经验分享]C# 操作Windows系统计划任务

    背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每 ...

  3. 适用于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通用)>,现在重新整理一 ...

  4. 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

  5. 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)

    近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...

  6. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

  7. 对实体类的CRUD操作

    --------------------siwuxie095 对实体类的 CRUD 操作 1.创建数据库和表 (1)创建一个 MySQL 连接:mybatis_conn (2)创建一个数据库:myba ...

  8. 【求建议】毕业之声——信院IT类毕业学子经验分享交流会

    一:缘由 在和非常多学子交流,及上课的经历中,发现一个非常普遍的现象:部分大一学生即失去了对学习.对专业的兴趣.有人在迷茫之后奋起直追.从而珍惜利用不多的大学时光努力提高自己.有人在迷茫中沉沦,沉迷于 ...

  9. (转)基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

    http://www.cnblogs.com/wuhuacong/p/3352016.html 在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的 ...

随机推荐

  1. 测试工具jmeter

    测试工具jmeter http:压力测试 https://www.cnblogs.com/stulzq/p/8971531.html

  2. HttpServletResponse 返回的json数据不是json字符串,而是json对象

    今天在改一个bug 情况: 在spring boot中写了一个类Result ,用来统一封装 各个API响应结果 , 其中重写了toString()方法来返回 json字符串 . 在正常情况下,从其它 ...

  3. 第六章 组件 59 组件切换-使用Vue提供的component元素实现组件切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. CentOS7 安装 RocketMQ 实践和小示例

    CentOS7 安装 RocketMQ 实践和小示例 1.通过 SSH 工具(比如 XShell)连接到 CentOS7 服务器上: 2.进入到 /usr/local 目录中: cd /usr/loc ...

  5. Python实现Windows CMD命令行彩色输出

    #! /usr/bin/env python #coding=utf-8   import ctypes,sys   STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE ...

  6. stm32 cubemx hal dma uart参考例程,发送和接收

    参考:https://blog.csdn.net/toopoo/article/details/80012317https://blog.csdn.net/morixinguan/article/de ...

  7. github高速下载的方法

    windows修改host文件: C:\Windows\System32\drivers\etc\hostslinux 修改host文件: /etc/hosts 在文件后面加上这两行 151.101. ...

  8. 【学习备份】ajax添加小例子

    实现目的:保存模板编号.模板名称到数据库 1.js引用 <script src="../../../../../../../js/jquery-1.10.2.min.js"& ...

  9. 字符单链表识别数字,字母,其它字符,并分为三个循环链表的算法c++实现

    已知一个单链表中的数据元素含有三类字符(即字母字符,数字字符和其它字符),试编写算法,构造三个循环链表,使每个循环链表中只含有同一类的字符,且利用原表中的结点空间作为这三个表的结点空间. 实现源代码: ...

  10. springboot中如何启动tomcat

    springboot启动时,会自动识别出当前环境是否是web环境还是非web环境. 默认的web环境的context(DEFAULT_WEB_CONTEXT_CLASS):org.springfram ...