c#中我们可以使用MongoDB.Driver驱动进行对MongoDB数据库的增删改查.
首先需要在NuGet中安装驱动
安装完毕后会发现会有三个引用
其中 MongoDB.Driver和MongoDB.Driver.Core是MongoDB的驱动,而MongoDB.Bson是MongoDB以Bson方式存储
注:BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型
1.配置MongoDB
//实例化Mongo的连接字符串对象 static MongoUrl mongoUrl = new MongoUrl("mongodb://127.0.0.1:27017"); //实例化Mongo客户端对象 static MongoClient client = new MongoClient(mongoUrl); //获取所操作的数据库 static IMongoDatabase db = client.GetDatabase("user"); //获取所操作的集合 static IMongoCollection<User> coll = db.GetCollection<User>("User");
通过上面简单的代码就可以配置完成MongoDB的连接和设置等操作.
其中IMongoCollection接口中封装了对Mongo的CURD操作
上面代码中泛型User为自定义实体类User
public class User { [BsonId] public string ID { get; set; } public string Name { get; set; } public string Sex { get; set; } [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime BornDate { get; set; } public override string ToString() { return $"姓名{Name},性别{Sex},出生日期{BornDate}"; } }
User实体类中ID和BornDate属性都存在这特性,其中ID属性特性BsonId是声明此属性为数据库中ID,而BornDate中的特性是说明BornDate的序列化方式
2.增加
增加使用IMongoCollection接口中的InsertOne和InsertMany方法,分别为增加一个和多个
public static void AddOne() { User user = new User { ID = Guid.NewGuid().ToString(), Name = "狗娃", Sex = "男", BornDate = DateTime.Now }; coll.InsertOne(user); } public static void AddMany() { IEnumerable<User> users = new List<User> { new User{ID = Guid.NewGuid().ToString(),Name = "狗剩",Sex = "女",BornDate = DateTime.Now}, new User{ID = Guid.NewGuid().ToString(),Name = "铁蛋",Sex = "男",BornDate = DateTime.Now} }; coll.InsertMany(users); }
3.查询
查询使用Find方法,其中Find方法有多个参数,例如下面代码:
public static void Find1() { var entitys = coll.Find<User>(y => y.Sex == "男").ToList(); foreach (var entity in entitys) { Console.WriteLine(entity); } } public static void Find2() { //创建过滤器 FilterDefinition<User> filter = Builders<User>.Filter.Eq(y => y.Sex, "男"); var entitys = coll.Find(filter).ToList(); foreach (var item in entitys) { Console.WriteLine(item); } }
上面代码中我们使用了两种重载,第一种直接在FInd方法中创建Lambda,第二种使用过滤器.两种方式效果一样,不过推荐第一种.
注:Builders.Filter是一个FilterDefinitionBuilder类:;这个类中存在这多种条件。
4.修改
IMongoCollection中有UpdateOne和UpdateMany两类方法,其中UpdateOne更改匹配到的第一项,而UpdateMany更改匹配到的所有项
public static void UpdateOne() { UpdateDefinition<User> update= Builders<User>.Update.Set(y => y.Sex, "男"); var res= coll.UpdateOne<User>(y => y.Sex == "女", update); Console.WriteLine(res.MatchedCount); } public static void UpdateMany() { UpdateDefinition<User> update = Builders<User>.Update.Set(y => y.Sex, "男"); var res = coll.UpdateMany<User>(y => y.Sex == "女", update); Console.WriteLine(res.MatchedCount); }
以上两个方法其中第一个方法只会更新一条,而第二个会更新两条.
更新时需要先创建所更新的项,即创建UpdateDefinition类实例,通过Builders.Update.Set获取.
然后通过IMongoCollection对象的UpdateOne/UpdateMany方法进行修改,UpdateOne/UpdateMany方法会返回一个UpdateResult对象,这个对象包含着修改的信息
5.删除
IMongoCollection删除方法也是两类,DeleteOne/DeleteMany,其规则与其它一样
public static void DeleteOne() { var res= coll.DeleteOne(y => true); Console.WriteLine(res.DeletedCount); } public static void DeleteMany() { var res = coll.DeleteMany(y => true); Console.WriteLine(res.DeletedCount); }
删除方法也会返回一个DeleteResult对象,其包含着删除的信息.
6.其它方法
在查询时,MongoDB.Driver也可以跟其它数据库一样使用分页,排序等
如排序查询
var entitys = coll.Find<User>(y => y.Sex == "男").Sort(Builders<User>.Sort.Ascending(y=>y.Age)).ToList();
分页查询
var entitys = coll.Find<User>(y => y.Sex == "男").Skip(4).Limit(3).ToList();