1、 MongoDb 简介
MongoDB 是为互联网而生的数据库,是文档数据库。
MongoDB 的优点: 1) Schema-less,不需要预先定义表结构,同一个“表”中可以保存多个格式的数据; 2) 数据支持嵌套,数据以 json 格式存储; 3) 允许使用 JavaScript 写服务端脚本,类似于存储过程; 4) 支持 Map/Reduce; 5) MongoDB 支持地理位置索引,可以直接用于位置距离计算和查询,实现“附近的人”、 “滴滴打车接单”等很容易;
MongoDB 的缺点: 1) Mongodb 没有“数据一致性检查”、“事务”等,不适合存储对数据事务要求高(比如金 融)的数据;只适合放非关键性数据(比如日志或者缓存)。 2) 关联查询很弱,不适合做报表查询
2、 MongoDB 服务器的安装
Windows 下安装: https://www.mongodb.com/ 到 download 的地方下载,下载【Community Server】,里 面有各种操作系统下的安装方法。 生产环境肯定要是 Windows-Server,但是在测试学习阶段,如果你电脑是 Win7/8/10, 那么下载“Windows Server 2008 64-bit, without SSL support x64”就行,是支持 Win7 以上 64 位系统的。 mongodb 默认使用 C:datadb作为数据文件夹,需要先创建这个文件夹,然后启动
C:Program FilesMongoDBServerxxxin 下的 mongod.exe,这样服务器就启动起来了,如果 启动出错一闪而过,那么 cmd 去执行,就能看到报错信息。
把 MongoDB 安装成 windows 服务的方法: 1) 创建一个配置文件 mongod.cfg,在 C:Program FilesMongoDBServer3.4in 下,内容是: systemLog: destination: file path: c:datalogmongod.log storage: dbPath: c:datadb 把配置文件中的文件夹创建起来。 2) 注册成系统服务:mongod --config "C:Program FilesMongoDBServer3.4inmongod.cfg" –install 3) 启动服务 net start MongoDB
windows 安装方法 https://docs.mongodb.com/master/tutorial/install-mongodb-on-windows/ Ubuntu 安装方法 https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/
3、 MongoDB GUI 客户端
MongoDB 客户端有很多,有免费的、有收费的,这里推荐一个 Robo 3T,提供下载地址:。。。 因为官网的下载地址下载太慢
4、 .Net 连接 MongoDB
安装.Net 驱动:Install-Package MongoDB.Driver
数据插入: MongoClient client = new MongoClient("mongodb://localhost"); IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库 IMongoCollection< Person> collection = database.GetCollection<Person>("Persons");//大致相当 于“表” Person p1 = new Person(); p1.Id = 1; p1.Name = "rupeng"; p1.Age = 5; collection.InsertOne (p1);//也支持异步方法,后面建议都用异步的!习惯成自然!
回到客户端工具刷新一下,就能看到新插入的数据,MongoDB 会自动创建“数据库” 以及 Collection(约等于“表”)。MongoDB 默认用 id 做主键,因此不用显式指定 id 是主键。 MongoDB 中没有内置“自增字段”,可以把 Id 声明为 ObjectId 类型(using MongoDB.Bson) 这样插入以后就自动给字段赋值。 class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
IMongoCollection<Dog> dogs = database.GetCollection<Dog>("Dogs"); Dog d1 = new Dog(); d1.Age = 33; d1.Name = "jacky"; dogs.InsertOne(d1);
MongoDB 是用 json 保存的,因此也可以直接以 json 格式插入,用 BsonDocument 来代 表: IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs"); string json = "{id:8889,Age:81,Name:'japan',gender:true}"; BsonDocument p1 = BsonDocument.Parse(json); dogs.InsertOne(p1);
还可以插入有嵌套关系的对象,比如学生和老师,注意不会有表间关系,都是存到一个集合 中,注意和关系库不一样。
5、 查询
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons"); var filter1 = Builders<Person>.Filter.Gt(p=>p.Age,5);//Gt:大于。 using (var personsCursor = await collection.FindAsync<Person>(filter1)) { while (personsCursor.MoveNext()) { var persons = personsCursor.Current; foreach (var p in persons) { MessageBox.Show(p.Name); } } } 为什么 FindAsync 不直接返回集合,而是要 MoveNext 之后返回一个集合呢?因为返回 的数据量可能很大,因此 MongoDB 是分批下载,下载一批之后执行 GET_More 操作返回下 一批。可以通过 FindOptions 参数的 BatchSize 设置每一批的大小。 如果确认返回的数据量 不大,可以 var ps = await personsCursor.ToListAsync()(或者 ToEnumerable()等)一下子返回所有数据。还有 Any、First、FirstOrDefault 等以及异步操作。 需要注意 MongoDB 中查询区分大小写。
6、 数据过滤
过滤条件可以写成:var filter1 = Builders<Person>.Filter.Gt(“Age”,5);或者 除了 Gt,还有 Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。 当然最常用的还是 Where 操作: var filter1 = Builders<Person>.Filter.Where(p => p.Age >= 5 && p.Name == "rupeng"); using (var personsCursor = await collection.FindAsync(filter1)) {foreach (var p in await personsCursor.ToListAsync()) { MessageBox.Show(p.Name); } }
7、 分页获取
FindOptions<Person,Person> findOpt = new FindOptions<Person, Person>(); findOpt.Limit = 5;//取最多几条 findOpt.Skip = 2;//跳过几条 var filter1 = Builders<Person>.Filter.Where(p => p.Age >= 5 && p.Name == "rupeng"); using (var personsCursor = await collection.FindAsync(filter1, findOpt)) { foreach (var p in await personsCursor.ToListAsync()) { MessageBox.Show(p.Name); } } 指定排序规则: findOpt.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Descending(p => p.Name);
8、 Bson
如果用 BsonDocument,有一些操作还是比较麻烦的: IMongoCollection<BsonDocument> persons = database.GetCollection<BsonDocument>("Persons"); var filter1 = Builders<BsonDocument>.Filter.Gt("Age", 5); using (var personsCursor = await persons.FindAsync(filter1)) { foreach (var p in await personsCursor.ToListAsync()) { MessageBox.Show(p.GetValue("Name").AsString); } }
9、 更新数据
IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons"); var filter = Builders<Person>.Filter.Where(p => p.Age <= 5); var update = Builders<Person>.Update .Set(p=>p.Age,8); teachers.UpdateMany(filter, update);
10、 删除数据
IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons"); var filter = Builders<Person>.Filter.Where(p => p.Age <= 5); teachers.DeleteMany(filter); 用 Update 机会比较少,如果频繁的用 Update 可能意味着用错了;也不要想着 join、group by, 还是场景不对!用 MongoDB 做一个分布式日志系统。
11、 MongoDB 应用场景
日志记录系统;设备监控数据的存储;饿了么外卖骑手接单; 存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据; 但是像订单、金融交易、游戏装备等这些关键信息不要用 MongoDB;