C#封装MongoDB工具类库

什么是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 = 1, Name = "曾城", Birthday = DateTime.Parse("1900-1-1"), CountryName = "中国", Club = "广州恒大", Position = "GK" };
mgdbUtil.Insert(t);
//更新一条数据
PlayerEntity t2 = new PlayerEntity() { NId = 1, Name = "曾城update", Birthday = DateTime.Now, CountryName = "中国", Club = "广州恒大", Position = "GK" };
mgdbUtil.Update(t2, s => s.NId == 1);
//查询一条数据
var m = mgdbUtil.GetEntity(s => s.NId == 1);
Console.WriteLine(JsonUtil.Serialize(m));
//删除一条数据
mgdbUtil.Delete(s => s.NId == 1);

 

MongoDBUtil连接类

 

 1 public class MongoDB
 2     {
 3         private static string connStr = ConfigUtil.GetValue(SysConstant._MongoDBConnection);
 4 
 5         private static string dbName = ConfigUtil.GetValue(SysConstant._MongoDB);
 6 
 7         private static IMongoDatabase db = null;
 8 
 9         private static readonly object lockHelper = new object();
10 
11         private MongoDB()
12         {
13         }
14 
15         /// <summary>
16         /// 创建DB
17         /// </summary>
18         /// <returns></returns>
19         public static IMongoDatabase CreateDB()
20         {
21             if (db == null)
22             {
23                 lock (lockHelper)
24                 {
25                     if (db == null)
26                     {
27                         var client = new MongoClient(connStr);
28                         db = client.GetDatabase(dbName);
29                     }
30                 }
31             }
32             return db;
33         }
34     }

 

MongoDBUtil数据操作类

  1 public class MongoDBUtil<T> where T : BaseEntity
  2     {
  3         private IMongoDatabase db = null;
  4         private IMongoCollection<T> collection = null;
  5 
  6         public MongoDBUtil()
  7         {
  8             this.db = MongoDB.CreateDB();
  9             collection = db.GetCollection<T>(typeof(T).Name);
 10         }
 11 
 12         /// <summary>
 13         /// 添加一条对象记录
 14         /// </summary>
 15         /// <param name="entity"></param>
 16         /// <returns></returns>
 17         public T Insert(T entity)
 18         {
 19             entity.Id = ObjectId.GenerateNewId();
 20             collection.InsertOne(entity);
 21             return entity;
 22         }
 23 
 24         /// <summary>
 25         /// 根据ID更新一条记录  
 26         /// </summary>
 27         /// <param name="id"></param>
 28         /// <param name="field"></param>
 29         /// <param name="value"></param>
 30         public void Update(string id, string field, string value)
 31         {
 32             var filter = Builders<T>.Filter.Eq("Id", id);
 33             var updated = Builders<T>.Update.Set(field, value);
 34             UpdateResult result = collection.UpdateOneAsync(filter, updated).Result;
 35         }
 36 
 37         /// <summary>
 38         /// 根据ID更新一条记录
 39         /// </summary>
 40         /// <param name="entity"></param>
 41         /// <param name="id"></param>
 42         public void Update(T entity, string id)
 43         {
 44             Update(entity, a => a.Id == ObjectId.Parse(id));
 45         }
 46 
 47         /// <summary>
 48         /// 根据条件更新一条记录
 49         /// </summary>
 50         /// <param name="entity"></param>
 51         /// <param name="func"></param>
 52         public void Update(T entity, Expression<Func<T, bool>> func)
 53         {
 54             var old = GetEntity(func);
 55             foreach (var prop in entity.GetType().GetProperties())
 56             {
 57                 if (prop.Name.Equals("Id"))
 58                     continue;
 59                 var newValue = prop.GetValue(entity);
 60                 var oldValue = old.GetType().GetProperty(prop.Name).GetValue(old);
 61                 if (newValue != null)
 62                 {
 63                     if (!newValue.ToString().Equals(oldValue.ToString()))
 64                     {
 65                         old.GetType().GetProperty(prop.Name).SetValue(old, newValue);
 66                     }
 67                 }
 68             }
 69             collection.ReplaceOne(func, old);
 70         }
 71 
 72         /// <summary>
 73         /// 根据ID获取对象
 74         /// </summary>
 75         /// <param name="id"></param>
 76         /// <returns></returns>
 77         public T GetEntity(string id)
 78         {
 79             return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault();
 80         }
 81 
 82         /// <summary>
 83         /// Lambar 表达式选择一个模型
 84         /// </summary>
 85         /// <param name="func"></param>
 86         /// <returns></returns>
 87         public T GetEntity(Expression<Func<T, bool>> func)
 88         {
 89             return collection.Find(func).ToList().FirstOrDefault();
 90         }
 91 
 92         /// <summary>
 93         /// 获取全部信息
 94         /// </summary>
 95         /// <returns></returns>
 96         public List<T> ListAll()
 97         {
 98             return ListByCondition(s => 1 == 1);
 99         }
100 
101         /// <summary>
102         /// 根据条件筛选列表
103         /// </summary>
104         /// <param name="func"></param>
105         /// <returns></returns>
106         public List<T> ListByCondition(Expression<Func<T, bool>> func)
107         {
108             return collection.Find(func).ToList<T>();
109         }
110 
111         /// <summary>
112         /// 获取列表
113         /// </summary>
114         /// <param name="func"></param>
115         /// <param name="count">数量</param>
116         /// <returns></returns>
117         public List<T> ListByCondition(Expression<Func<T, bool>> func, int count)
118         {
119             return collection.Find(func).Limit(count).ToList();
120         }
121 
122         /// <summary>
123         /// 获取分页列表
124         /// </summary>
125         /// <param name="func"></param>
126         /// <param name="page"></param>
127         /// <param name="pageSize"></param>
128         /// <param name="record"></param>
129         /// <param name="sort"></param>
130         /// <returns></returns>
131         public List<T> ListPage(Expression<Func<T, bool>> func, int page, int pageSize, ref long record, SortDefinition<T> sort = null)
132         {
133             record = collection.Count(func);
134             return collection.Find(func).Sort(sort).Skip((page - 1) * pageSize).Limit(pageSize).ToList();
135         }
136 
137         /// <summary>
138         /// 删除数据
139         /// </summary>
140         /// <param name="func"></param>
141         /// <returns></returns>
142         public long Delete(Expression<Func<T, bool>> func)
143         {
144             return collection.DeleteMany(func).DeletedCount;
145         }
146 
147         /// <summary>
148         /// 删除全部
149         /// </summary>
150         /// <returns></returns>
151         public long DeleteAll()
152         {
153             return Delete(s => 1 == 1);
154         }
155     }

 

问题:

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

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

 

测试结果:

MongoDB测试结果

 

 

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

 

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

 

转载于:https://www.cnblogs.com/chenminli/p/6646703.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作monodb的c#封装,调用非常方便,可以继承,功能包括: 1、所有数据库操作 2、前台表格类数据获取 public List GetList(List lstColName, Document query, JqGridParam jqParam, ref int count),封装了通用的获取前台表格数据的方法,将在工程中减少大量数据库访问代码,有了这个后对前台表格类查询我们可以不用在Control里使用linq或者封装在Model里然后对前台定义视图类了,使用如下: try { JqGridParam jqParam = new JqGridParam(); jqParam.page = 1; jqParam.rows = 1000; MemberOper memOper = new MemberOper(); MongoBasicOper monOper = new MongoBasicOper(DTName.GROUP_MEMBER); int count = 0; //过滤条件 Document query = new Document(); if (!string.IsNullOrEmpty(find)) { MongoRegex reg = new MongoRegex(".*" + find + ".*"); query.Add(DColName.Name, reg); } query.Add(DColName.GroupId, g); Document[] docStatus = new Document[] { new Document(DColName.Status, RowStatus.Pass), new Document(DColName.Status, RowStatus.Admin) }; query.Add("$or", docStatus); //查询列 List lstColName = new List(); lstColName.Add(DColName.UserId); lstColName.Add(DColName.UserName); //查询数据 var lstRes = monOper.GetListEx(lstColName, query, jqParam, ref count); //转换返回值 JqGrid jg = new JqGrid(); if (count == 0) { return Json(jg.toNull(jqParam), JsonRequestBehavior.AllowGet); } var jsonData = jg.toJson(jqParam, count, lstRes, lstColName); jsonData.param = g; return Json(jsonData, JsonRequestBehavior.AllowGet); } catch (Exception e) { return Json(e.Message, JsonRequestBehavior.AllowGet); }
C#MongoDB的分片是指将MongoDB数据库的数据水平分割为多个分片(shard),以实现数据的分布式存储和处理。C#是一种编程语言,而MongoDB是一种NoSQL数据库。 在C#中,可以使用MongoDB的官方驱动程序来进行与MongoDB数据库的交互和操作。要使用分片功能,首先需要在MongoDB服务器上进行配置和设置。以下是基本的步骤: 1. 安装和配置MongoDB服务器:确保MongoDB服务器已正确安装并启动。在服务器配置文件中启用分片功能。 2. 创建MongoDB分片集群:在服务器上创建一个或多个分片节点,并将它们集成为一个分片集群。 3. 配置MongoDB路由器:配置MongoDB路由器(也称为mongos)以连接到分片集群,并提供客户端访问接口。 4. 创建分片键:选择一个合适的字段作为分片键,并将其用于将数据分布到不同的分片上。分片键的选择对于数据均衡和查询性能至关重要。 5. 启用分片:在MongoDB路由器上使用相应的命令或API启用分片功能,并指定分片键。 一旦完成上述配置,你可以使用C#编写代码来连接到MongoDB路由器,并执行对数据库的操作。在C#中,可以使用MongoDB的官方驱动程序提供的API来进行插入、查询、更新和删除等操作。根据你的具体需求,可以编写适当的代码来处理分片集群中的数据。 需要注意的是,分片功能的配置和使用相对复杂,需要仔细考虑数据模型和查询模式,以确保良好的性能和可扩展性。在开发过程中,可以参考MongoDB官方文档和C#驱动程序的文档来获取更详细的信息和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值