什么是MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB安装

  园内很多教程,比较详细的在这里

工具类说明

1、基于MongoDB.Driver封装MongoDB的一些基本操作

2、利用反射每个实体类名作为存储数据的表名

3、数据ID自增使用MongoDB自带的ObjectID

MongoDB连接类

//实例化对象 类名保存为MongoDB表名称
MongoDBUtil<PlayerEntity> mgdbUtil = new MongoDBUtil<PlayerEntity>();
//清空数据
mgdbUtil.DeleteAll();
//插入一条数据
PlayerEntity t = new PlayerEntity() { NId = , Name = "曾城", Birthday = DateTime.Parse("1900-1-1"), CountryName = "中国", Club = "广州恒大", Position = "GK" };
mgdbUtil.Insert(t);
//更新一条数据
PlayerEntity t2 = new PlayerEntity() { NId = , Name = "曾城update", Birthday = DateTime.Now, CountryName = "中国", Club = "广州恒大", Position = "GK" };
mgdbUtil.Update(t2, s => s.NId == );
//查询一条数据
var m = mgdbUtil.GetEntity(s => s.NId == );
Console.WriteLine(JsonUtil.Serialize(m));
//删除一条数据
mgdbUtil.Delete(s => s.NId == );

MongoDBUtil连接类

 public class MongoDB
{
private static string connStr = ConfigUtil.GetValue(SysConstant._MongoDBConnection); private static string dbName = ConfigUtil.GetValue(SysConstant._MongoDB); private static IMongoDatabase db = null; private static readonly object lockHelper = new object(); private MongoDB()
{
} /// <summary>
/// 创建DB
/// </summary>
/// <returns></returns>
public static IMongoDatabase CreateDB()
{
if (db == null)
{
lock (lockHelper)
{
if (db == null)
{
var client = new MongoClient(connStr);
db = client.GetDatabase(dbName);
}
}
}
return db;
}
}

MongoDBUtil数据操作类

 public class MongoDBUtil<T> where T : BaseEntity
{
private IMongoDatabase db = null;
private IMongoCollection<T> collection = null; public MongoDBUtil()
{
this.db = MongoDB.CreateDB();
collection = db.GetCollection<T>(typeof(T).Name);
} /// <summary>
/// 添加一条对象记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T Insert(T entity)
{
entity.Id = ObjectId.GenerateNewId();
collection.InsertOne(entity);
return entity;
} /// <summary>
/// 根据ID更新一条记录
/// </summary>
/// <param name="id"></param>
/// <param name="field"></param>
/// <param name="value"></param>
public void Update(string id, string field, string value)
{
var filter = Builders<T>.Filter.Eq("Id", id);
var updated = Builders<T>.Update.Set(field, value);
UpdateResult result = collection.UpdateOneAsync(filter, updated).Result;
} /// <summary>
/// 根据ID更新一条记录
/// </summary>
/// <param name="entity"></param>
/// <param name="id"></param>
public void Update(T entity, string id)
{
Update(entity, a => a.Id == ObjectId.Parse(id));
} /// <summary>
/// 根据条件更新一条记录
/// </summary>
/// <param name="entity"></param>
/// <param name="func"></param>
public void Update(T entity, Expression<Func<T, bool>> func)
{
var old = GetEntity(func);
foreach (var prop in entity.GetType().GetProperties())
{
if (prop.Name.Equals("Id"))
continue;
var newValue = prop.GetValue(entity);
var oldValue = old.GetType().GetProperty(prop.Name).GetValue(old);
if (newValue != null)
{
if (!newValue.ToString().Equals(oldValue.ToString()))
{
old.GetType().GetProperty(prop.Name).SetValue(old, newValue);
}
}
}
collection.ReplaceOne(func, old);
} /// <summary>
/// 根据ID获取对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T GetEntity(string id)
{
return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault();
} /// <summary>
/// Lambar 表达式选择一个模型
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public T GetEntity(Expression<Func<T, bool>> func)
{
return collection.Find(func).ToList().FirstOrDefault();
} /// <summary>
/// 获取全部信息
/// </summary>
/// <returns></returns>
public List<T> ListAll()
{
return ListByCondition(s => == );
} /// <summary>
/// 根据条件筛选列表
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public List<T> ListByCondition(Expression<Func<T, bool>> func)
{
return collection.Find(func).ToList<T>();
} /// <summary>
/// 获取列表
/// </summary>
/// <param name="func"></param>
/// <param name="count">数量</param>
/// <returns></returns>
public List<T> ListByCondition(Expression<Func<T, bool>> func, int count)
{
return collection.Find(func).Limit(count).ToList();
} /// <summary>
/// 获取分页列表
/// </summary>
/// <param name="func"></param>
/// <param name="page"></param>
/// <param name="pageSize"></param>
/// <param name="record"></param>
/// <param name="sort"></param>
/// <returns></returns>
public List<T> ListPage(Expression<Func<T, bool>> func, int page, int pageSize, ref long record, SortDefinition<T> sort = null)
{
record = collection.Count(func);
return collection.Find(func).Sort(sort).Skip((page - ) * pageSize).Limit(pageSize).ToList();
} /// <summary>
/// 删除数据
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
public long Delete(Expression<Func<T, bool>> func)
{
return collection.DeleteMany(func).DeletedCount;
} /// <summary>
/// 删除全部
/// </summary>
/// <returns></returns>
public long DeleteAll()
{
return Delete(s => == );
}
}

问题:

目前数据Id自增采用MongoDB默认ObjectId,暂未实现自定义自增解决方案

MongoDB 日期类型保存为UTC格式,
例:本地时间(8时区)2017-03-30 15:00:00 MongoDB保存为(格林尼治时间):ISODate("2017-03-30T07:00:00.000Z")
相差8小时

测试结果:

Github开源地址:https://github.com/willianchen/CML.MongoDB

欢迎各位园友测试与拍砖,基于上面的问题希望大家各抒己见,提供一些解决方案。

C#封装MongoDB工具类库的更多相关文章

  1. 编写更少量的代码:使用apache commons工具类库

    Commons-configuration   Commons-FileUpload   Commons DbUtils   Commons BeanUtils  Commons CLI  Commo ...

  2. Flutter 常用工具类库common_utils

    地址:https://pub.flutter-io.cn/packages/common_utils#-readme-tab- Dart常用工具类库 common_utils 1.TimelineUt ...

  3. Java程序员都应该去使用一下这款强大的国产工具类库

    这不是标题党,今天给大家推荐一个很棒的国产工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在使用了,如果你还没有使用过,那不妨去尝试一下,我们项目组目前也在用这个.这篇文章来简单介 ...

  4. 转】upstart封装mongodb应用为系统服务

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! upstart封装mongodb应用为系统服务 ...

  5. Apache—dbutils开源JDBC工具类库简介

    Apache—dbutils开源JDBC工具类库简介 一.前言 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用 ...

  6. 国人开源了一款小而全的 Java 工具类库,厉害啊!!

    最近栈长看到了一款小而全的 Java 工具类库:Hutool,Github 已经接近 14K Star 了,想必一定很优秀,现在推荐给大家,很多轮子不要再造了! Hutool 是什么 Hutool 是 ...

  7. Hutool :一个小而全的 Java 工具类库

    Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...

  8. 好用的Java工具类库,GitHub星标10k+你在用吗?

    简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音"糊涂",寓意追求"万事都作糊涂观,无所谓失,无所谓得& ...

  9. .NET3.5中JSON用法以及封装JsonUtils工具类

    .NET3.5中JSON用法以及封装JsonUtils工具类  我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...

随机推荐

  1. 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码

    下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´  开发公司:www.devexpress.com,老牌控件公司 ´  ...

  2. 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用

    1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些“讲道理”的人员,这些客户尝试把工作做好,他们希望能 ...

  3. .Net Standard扩展支持实例分享

    上篇(.Net基础体系和跨框架开发普及)介绍了.Net当前生态下的大概情况,也分享了简单实现的过程,这篇文章就是讲解我的OSS.Common项目扩展.Net Standard 支持的过程,主要集中在: ...

  4. SQL Server 2008R2 企业版 百度云下载地址

    SQL Server 2008R2 (百度云下载地址:链接: http://pan.baidu.com/s/1mi34II8 密码: yc1w)   ASP.NET MVC4.0+ WebAPI+Ea ...

  5. Android中Handler使用浅析

    1. Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎 ...

  6. webpack配置React开发环境(上)

    Webpack 是一个前端资源加载/打包工具,我们部门的一条主要技术栈就是Webpack+React+ES6+node,虽然之前自己做个人项目也接触好多次Webpack,但是自己并没有研读总结过Web ...

  7. 利用instsrv和srvany来手动安装服务

    Windows提供了两个小工具instsrv.exe和srvany.exe来把任何应用包装成windows服务.顾名思义instsrv(install service)是用来安装服务的,而srvany ...

  8. 查找第K小数

    题目描述 查找一个数组的第K小的数,注意同样大小算一样大. 如  2 1 3 4 5 2 第三小数为3. 输入描述: 输入有多组数据.每组输入n,然后输入n个整数(1<=n<=1000), ...

  9. 如何理解jQuery中的ajaxSubmit方法

    版权声明:本文为博主原创文章,转载请标注:www.cnblogs.com/gdsblog 刚刚学习中,使用到了ajaxSubmit,犹豫以前没有接触㢧这个,所以刚开始是一脸懵逼状态,最后通过查找资料的 ...

  10. 使用es6特性封装async-mysql

    node.js的mysql模块本身没有提供返回promise的函数,即是说都是用的回调函数,那么对于我们使用async函数是很不方便的一件事.node.js有一个mysql封装库叫mysql-prom ...