当前位置: 首页 > 数据库 > MongoDB > 正文

.net平台的MongoDB使用

2018-04-23 来源:博客园/陈珙

前言

最近花了点时间玩了下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 }

View Code

第一个demo:添加数据就完成了。F12可以看到IMongoCollection这个接口,增删改查都有,注意分One和Many。基础的使用就不扯过多,在文章尾部的代码已经提供增删改查的封装。

增删查的封装相对简单,但是MongoDB.Driver提供的update的稍微比较特殊。通过Builders<T>.Update.Set(_fieldname, value)更新指定字段名,有多个字段名需要修改,就要通过new UpdateDefinitionBuilder<T>().Combine(updateDefinitionList)去完成

然而,这种方式并不适用于我们实际开发,因此需要对Update方法进行 实体更新封装Lambda更新封装