MongoDB学习笔记

这是一个文档数据库

优缺点:

  优点:

    1. Schema-less,不需要预先定义表结构,同一个“表”中可以保存多个格式的数据
    2. 数据支持嵌套,数据以 json 格式存储
    3. 允许使用 JavaScript 写服务端脚本,类似于存储过程
    4. 支持 Map/Reduce
    5. MongoDB 支持地理位置索引,可以直接用于位置距离计算和查询,实现“附近的人”

  缺点:

  1. Mongodb 没有“数据一致性检查”、“事务”等,不适合存储对数据事务要求高(比如金融)的数据;只适合放非关键性数据(比如日志或者缓存)
  2. 关联查询很弱,不适合做报表查询

使用工具

  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的应用场景

日志记录系统、设备监控数据的存储,爬虫过来的第三方数据
不适合存关系性比较强的数据

 

posted @ 2017-11-09 11:31  大胖儿在努力  阅读(439)  评论(0)    收藏  举报