好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.Net中MongoDB的简单调用图文教程

前言

本文主要给大家介绍了关于 .Net 中MongoDB 调用 的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

方法如下:

1、安装.Net 驱动:Install-Package MongoDB .Driver

2、数据插入 ,链接数据库  

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//新建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 ; }

  }

?

1

2

3

4

5

6

7

8

9

10

11

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) 这样插入以后就自动给字段赋值。

?

1

2

3

4

//多条插入

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 来代表:

?

1

2

3

4

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);

还可以插入有嵌套关系的对象,比如学生和老师,注意不会有表间关系,都是存到一个集合中,注意和关系库不一样。

?

1

2

3

4

5

6

7

8

9

10

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); //单条插入

3、MongoDB查询

?

1

2

3

4

5

6

7

8

9

10

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 操作:

 异步查询

?

1

2

3

4

5

6

7

8

9

10

11

12

13

//异步查询

  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 设置每一批的大小。

  如果确认返回的数据量 不大,可以 var ps = await personsCursor.ToListAsync()(或者 ToEnumerable()等)一下子返回所有数据。还有 Any、First、FirstOrDefault 等以及异步操作。需要注意 MongoDB 中查询区分大小写。

4、分页查询

?

1

2

3

4

5

6

7

8

9

10

11

12

13

//分页

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);

5、Json格式取法

?

1

2

3

4

5

6

7

8

9

10

//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);

  }

}

6、Update更新操作

?

1

2

3

4

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);

7、Delete删除操作

?

1

2

3

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, 还是场景不对!

8、MongoDB 应用场景

  日志记录系统;设备监控数据的存储;饿了么外卖骑手接单; 存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据;

  但是像订单、金融交易、游戏装备等这些关键信息不要用 MongoDB;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

原文链接:https://www.cnblogs.com/whitebai/p/11689363.html

查看更多关于.Net中MongoDB的简单调用图文教程的详细内容...

  阅读:81次