一、安装.Net 驱动:Install-Package MongoDB.Driversql
二、数据插入 ,连接数据库 mongodb
//新建Person测试类 public class Person { public long Id { get; set; } public int Age { get; set; } public string Name { get; set; } public int Height { get; set; } public TestPerson t1{ get; set; } } public class TestPerson { public string Name { get; set; } } public class ObjectPerson { public ObjectId Id { get; set; } public int Age { get; set; } public string Name { get; set; } public int Height { get; set; } }
MongoClient client = new MongoClient("mongodb://127.0.0.1"); IMongoDatabase database = client.GetDatabase("TestDb");//至关于数据库 IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大体至关于表 Person p1 = new Person() { Id = 2, Name = "test1", Age = 29, Height=130 }; collection.InsertOne(p1);//单条插入也支持异步方法,后面建议都用异步的!习惯成天然!
回到客户端工具刷新一下,就能看到新插入的数据,MongoDB 会自动建立“数据库” 以及 Collection(约等于“表”)。MongoDB 默认用 id 作主键,所以不用显式指定 id 是主键。数据库
MongoDB 中没有内置“自增字段”,能够把 Id 声明为 ObjectId 类型(using MongoDB.Bson) 这样插入之后就自动给字段赋值。json
//多条插入 IMongoCollection<ObjectPerson> collection1 = database.GetCollection<ObjectPerson>("ObjectPersons");//大体至关于表 List<ObjectPerson> persons = new List<ObjectPerson>() { new ObjectPerson() { Name = "test2", Age = 30, Height = 135 }, new ObjectPerson() { Name = "test3", Age = 31, Height = 140 } }; collection1.InsertMany(persons);//多条插入
MongoDB 是用 json 保存的,所以也能够直接以 json 格式插入,用 BsonDocument 来表明:异步
IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs"); string jsondata = "{id:8999,Age:81,Name:'japan',gender:true}"; BsonDocument p2 = BsonDocument.Parse(jsondata); dogs.InsertOne(p2);
还能够插入有嵌套关系的对象,好比学生和老师,注意不会有表间关系,都是存到一个集合中,注意和关系库不同。
工具
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大体至关于表 Person p1 = new Person() { Id = 2, Name = "test1", Age = 29, Height=130, t1=new TestPerson() { Name="222"} }; collection.InsertOne(p1);//单条插入
三、MongoDB查询测试
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons"); var filter = Builders<Person>.Filter.Gt(p => p.Age,5); var filter1 = Builders<Person>.Filter.And(Builders<Person>.Filter.Gt(p => p.Age, 5), Builders<Person>.Filter.Eq(p => p.Id, 1));// And 而且 还有or方法 var filter2 = Builders<Person>.Filter.Where(p => p.Age > 5 && p.Id == 1);//和上面的写法是同样的可是,建议用Where方法 //普通查询 var result= collection.Find(filter).ToList(); foreach (var item in result) { Console.WriteLine(item.Age + item.Name); }
除了 Gt,还有 Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。 固然最经常使用的仍是 Where 操做: 网站
异步查询 ui
//异步查询 using (IAsyncCursor<Person> personsCursor = await collection.FindAsync<Person>(filter)) { while (personsCursor.MoveNextAsync().Result)//获取下一组数据,至关因而否有指针,MongoDB实际上是返回一个组,不像sql每次是一次次取 { IEnumerable<Person> items = personsCursor.Current;//返回当前组的数据 foreach (var item in items) { Console.WriteLine(item.Age + item.Name); } } //若是数据量不大,能够直接tolist var results = personsCursor.ToList(); }
为何 FindAsync 不直接返回集合,而是要 MoveNext 以后返回一个集合呢?由于返回 的数据量可能很大,所以 MongoDB 是分批下载,下载一批以后执行 GET_More 操做返回下 一批。能够经过 FindOptions 参数的 BatchSize 设置每一批的大小。spa
若是确认返回的数据量 不大,能够 var ps = await personsCursor.ToListAsync()(或者 ToEnumerable()等)一会儿返回全部数据。还有 Any、First、FirstOrDefault 等以及异步操做。须要注意 MongoDB 中查询区分大小写。
四、分页查询
//分页 FindOptions<Person, Person> findop = new FindOptions<Person, Person>(); findop.Limit = 3;//取最多几条 findop.Skip = 2;//跳过几条 findop.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Ascending(p => p.Name);//排序 using (var cursor = collection.FindAsync(filter, findop).Result) { var items = cursor.ToList(); foreach (var item in items) { Console.WriteLine(item.Age + item.Name); } }
指定排序规则 findop.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Ascending(p => p.Name);
五、Json格式取法
//json格式取法 IMongoCollection<BsonDocument> bsonDoc = database.GetCollection<BsonDocument>("Persons"); var filter4 = Builders<BsonDocument>.Filter.Gt("Age", 5); using (var persons=await bsonDoc.FindAsync(filter4))
{ foreach (var item in await persons.ToListAsync()) { Console.WriteLine(item.GetValue("Name").AsString); } }
六、Update更新操做
IMongoCollection<Person> upPersons = database.GetCollection<Person>("Persons"); var upFilter = Builders<Person>.Filter.Where(p => p.Age>20);//筛选条件 var update = Builders<Person>.Update.Set(c => c.Name, "test2");//更新条件,将Name更新成test2 upPersons.UpdateMany(filter, update);
七、Delete删除操做
IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons"); var deletefilter = Builders<Person>.Filter.Where(p => p.Id == 1); teachers.DeleteMany(deletefilter);
用 Update 机会比较少,若是频繁的用 Update 可能意味着用错了;也不要想着 join、group by, 仍是场景不对!
八、MongoDB 应用场景
日志记录系统;设备监控数据的存储;饿了么外卖骑手接单; 存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据;
可是像订单、金融交易、游戏装备等这些关键信息不要用 MongoDB;