MongoDB学习笔记
这是一个文档数据库
优缺点:
优点:
- Schema-less,不需要预先定义表结构,同一个“表”中可以保存多个格式的数据
- 数据支持嵌套,数据以 json 格式存储
- 允许使用 JavaScript 写服务端脚本,类似于存储过程
- 支持 Map/Reduce
- MongoDB 支持地理位置索引,可以直接用于位置距离计算和查询,实现“附近的人”
缺点:
- Mongodb 没有“数据一致性检查”、“事务”等,不适合存储对数据事务要求高(比如金融)的数据;只适合放非关键性数据(比如日志或者缓存)
- 关联查询很弱,不适合做报表查询
使用工具
GUI:Robo3T
第三方组件:Install-Package MongoDB.Driver
为什么使用这个第三方:因为可以使用兰巴达表达式的
数据插入
1 using MongoDB.Driver; 2 3 static void Main(string[] args) 4 { 5 MongoClient client = new MongoClient("mongodb://127.0.0.1"); 6 //获取数据库,如果没有则创建 7 IMongoDatabase db= client.GetDatabase("TestDB1"); 8 IMongoCollection<Person> persons= db.GetCollection<Person>("Persons"); 9 Person p1 = new Person(); 10 p1.Name = "ming"; 11 p1.Age = 18; 12 p1.Id = 1; 13 persons.InsertOne(p1); 14 Console.ReadKey(); 15 }
同时支持异步方法
通过客户端管理工具,可以看到插入的数据,MongoDB会自动创建数据库以及Collection(约等于“表”)。
MongoDB默认用id作为主键,因此不用显示指定id为主键。
MongoDB中没有内置自增字段,可以把id声明为ObjectId类型(using MongoDB.Bson)这样插入以后就自动给字段赋值。
MongoDB 是用 json 保存的,因此也可以直接以 json 格式插入,用 BsonDocument 来代表:
1 IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs"); 2 string json = "{id:8889,Age:81,Name:'japan',gender:true}"; 3 BsonDocument p1 = BsonDocument.Parse(json); 4 dogs.InsertOne(p1);
还可以插入嵌套关系的对象,比如学生和班级的关系,但不会有表间关系,都是存在一个集合中
查询
1 IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
2 //拿到查询条件filter
3 var filter1 = Builders<Person>.Filter.Gt(p=>p.Age,5);//Gt:大于。
4 //获取返回数据的Cursor,因为数据量可能很大所以用游标
5 using (var personsCursor = await collection.FindAsync<Person>(filter1))
6 {
7 //可以使用重载方法,通过 FindOptions 参数的 BatchSize 设置取回每一批数据的量
8 while (personsCursor.MoveNext())
9 {
10 var persons = personsCursor.Current;
11 foreach (var p in persons)
12 {
13 MessageBox.Show(p.Name);
14 }
15 }
16 }
如果确认返回的数据量 不大,可以 var ps = await personsCursor.ToListAsync() (或者ToEnumerable()等)一次性返回将所有数据加载到内存中。
还有 Any、First、FirstOrDefault 等以及异步操作。
需要注意 MongoDB 中查询区分大小写。
数据过滤
过滤条件可以写成:var filter1 = Builders<Person>.Filter.Gt(“Age”,5);
除了 Gt,还有 Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。
当然最常用的还是 Where 操作:
1 var filter1 = Builders<Person>.Filter.Where(p => p.Age >= 5 && p.Name == "lalala");
2 using (var personsCursor = await collection.FindAsync(filter1))
3 {
4 foreach (var p in await personsCursor.ToListAsync())
5 {
6 MessageBox.Show(p.Name);
7 }
8 }
分页、排序获取数据
1 FindOptions<Person,Person> findOpt = new FindOptions<Person, Person>();
2 findOpt.Limit = 5;//取最多几条
3 findOpt.Skip = 2;//跳过几条
4 var filter1 = Builders<Person>.Filter.Where(p => p.Age >= 5 && p.Name == "rupeng");
//指定排序规则
5 var sort=Builders<Person>.Sort.Ascending(e=>e.Age).Descending(a=>a.name);
6 findOpt.Sort=sort;
7 using (var personsCursor = await collection.FindAsync(filter1, findOpt))
8 {
9 foreach (var p in await personsCursor.ToListAsync())
10 {
11 MessageBox.Show(p.Name);
12 }
13 }
Bson的过滤情况
使用到这个情况时,可能数据结构比较乱,尽量应该避免使用这类情况
1 IMongoCollection<BsonDocument> persons = database.GetCollection<BsonDocument>("Persons"); 2 var filter1 = Builders<BsonDocument>.Filter.Gt("Age", 5); 3 using (var personsCursor = await persons.FindAsync(filter1)) 4 { 5 foreach (var p in await personsCursor.ToListAsync()) 6 { 7 MessageBox.Show(p.GetValue("Name").AsString); 8 } 9 }
数据更新
1 IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons"); 2 var filter = Builders<Person>.Filter.Where(p => p.Age <= 5); 3 var update = Builders<Person>.Update.Set(p=>p.Age,8); 4 teachers.UpdateMany(filter, update);
数据删除
1 IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons"); 2 var filter = Builders<Person>.Filter.Where(p => p.Age <= 5); 3 teachers.DeleteMany(filter);
MongoDB的应用场景
日志记录系统、设备监控数据的存储,爬虫过来的第三方数据
不适合存关系性比较强的数据
作者:大胖儿在努力
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号