前言
最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家。
本篇会设计到Lambda表达式的解析,有兴趣的同学也看看我之前写的《表达式树的解析》。
文章最后会给出源码下载地址。
MongoDB简介
MongoDB是一个基于分布式文件存储的非关系型数据库,相比于其他NoSql它支持复杂的查询。
文本是类似JSON的BSON格式,BSON是在JSON的基础上进化:更快的遍历、操作更简易、更多的数据类型。因此MongoDB可以存储比较复杂的数据类型,同样也支持建立索引。
MongoDB的概念有:
- DataBase(库)
- Collections(集合),类似于关系型数据库的表
- Document(文档),类似于关系型数据库的一条数据
MongoDB优缺点
- 优点
- 高效性,内置GridFS,从而达到海量数据存储,并且满足大数据集的快速范围查询。
- 高扩展性,分片使MongoDB的有更高的吞吐量,复制使MongoDB更高的可用性。
- BSON文档,易于理解、查看,
- 免费
- 缺点
- 不支持事务
- 不支持表关联
- 不耗CPU却耗内存
- 没有成熟的管理工具
MongoDB使用场景
拥有高效的存储的特点,让MongoDB用在操作日志记录是非常流行的做法。
随着版本的升级提供更加强大的功能,产品逐渐成熟用在主业务也很多,例如电商行业的订单系统与包裹跟踪模块,海量的主订单与订单明细,包裹的状态变更信息。
然而因为BSON文档的存储方式,使平常的开发的思维模式有所变更。举个栗子,传统用关系型数据库,订单模块就会分主订单表和订单明细表,创建订单就会用事务同时添加两表的数据,查找订单也会通过两表关联查询出来。但是使用MongoDB,主订单表与其明细,将会以一个完整的对象保存为文档。
也因为不支持事务、表关联的原因,它更加适合用作于一个完整的业务模块。
部分朋友会带着一个问题,非关系型数据库和关系型数据库哪个更好。我认为,谁都无法代替谁,一般情况下,非关系型数据库更多的作为关系型数据库扩展,用好了效果甚佳,滥用了只会寸步难行。
MongoDB安装
本来想写的,相应的文章在园子太多了,借用一位仁兄的博文,传送门
MongoDB下载地址:https://www.mongodb.com/download-center#community
管理工具:Robomongo,传送门
MongoDB.Driver的使用
创建一个控制台,到Nuget下载MongoDB.Driver。写入以下代码:
1 using System; 2 using FrameWork.MongoDB.MongoDbConfig; 3 using MongoDB.Bson.Serialization.Attributes; 4 using MongoDB.Driver; 5 6 namespace FrameWork.MongoDb.Demo 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 var database = "testdatabase"; 13 var collection = "TestMongo"; 14 var db = new MongoClient("您的地址").GetDatabase(database); 15 var coll = db.GetCollection<TestMongo>(collection); 16 17 var entity = new TestMongo 18 { 19 Name = "SkyChen", 20 Amount = 100, 21 CreateDateTime = DateTime.Now 22 }; 23 24 coll.InsertOneAsync(entity).ConfigureAwait(false); 25 26 } 27 } 28 29 public class TestMongo : MongoEntity 30 { 31 32 [BsonDateTimeOptions(Kind = DateTimeKind.Local)] 33 public DateTime CreateDateTime { get; set; } 34 35 public decimal Amount { get; set; } 36 37 public string Name { get; set; } 38 39 } 40 }
第一个demo:添加数据就完成了。F12可以看到IMongoCollection这个接口,增删改查都有,注意分One和Many。基础的使用就不扯过多,在文章尾部的代码已经提供增删改查的封装。
增删查的封装相对简单,但是MongoDB.Driver提供的update的稍微比较特殊。通过Builders<T>.Update.Set(_fieldname, value)更新指定字段名,有多个字段名需要修改,就要通过new UpdateDefinitionBuilder<T>().Combine(updateDefinitionList)去完成
然而,这种方式并不适用于我们实际开发,因此需要对Update方法进行 实体更新封装和Lambda更新封装。