MongoDB在.NetCore中的使用
概述
MongoDB是一种面向文档的数据库管理系统。MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。
使用文档的优点:
- 文档(即对象)对应于许多编程语言中的内置数据类型。
- 嵌入式文档和数组减少了对昂贵连接的需求。
- 动态模式支持流畅的多态性。
MongoDB属于NoSQL。NoSQL指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
NoSQL的优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
NoSQL的缺点:
- 没有标准化
- 有限的查询功能(到目前为止)
- 最终一致是不直观的程序
使用
安装配置MongoDB服务
略(请自行查阅)
注意:MongoDB没有默认用户,请使用如下命令创建用户并授权
//进入自带admin库
> use admin
//创建用户并设置职责
> db.createUser(
{
user: "admin",
pwd: "123456",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
项目中安装驱动
安装名为MongoDB.Driver的Nuget包
创建数据库连接
// 使用连接字符串连接
var client = new MongoClient("mongodb://localhost:27017");
获取数据库与集合
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
添加数据
单条插入InsertOne
//待添加的document
var doc = new BsonDocument{
{ "_id",1 },
{ "name", "张三" },
{ "age", 24 },
{ "ename", new BsonDocument
{
{ "firstname", "san" },
{ "lastname", "zhang" }
}
}
};
//InsertOne()添加单条docment
collection.InsertOne(doc);
批量插入InsertMany
略
查询
Find和Filter
//filter用于过滤,如查询name = 吴九的第一条记录
var filter = Builders<BsonDocument>.Filter;
//Find(filter)进行查询
var doc = collection.Find(filter.Eq("name", "张三")).FirstOrDefault();
filter提供多种方法,常见的有Eq()、Lt()、Gt()以及无条件Empty
AND、OR和Exists
//查询25<年龄<28的记录
var docs = collection.Find(filter.Gt("age", 22) & filter.Lt("age", 28)).ToList();
//查询年龄小于22或年龄大于28的记录
var docs = collection.Find(filter.Lt("age", 25) | filter.Gt("age", 28)).ToList();
//查询存在address字段的记录
var docs = collection.Find(filter.Exists("address")).ToList();
Sort和Projection
//年龄倒序排列
var docs = collection.Find(filter.Empty).Sort(sort.Descending("age")).ToList();
//查询指定字段
var docs = collection.Find(filter.Empty).Project(project.Include("name")//包含name
.Include("age")//包含age
.Exclude("_id")//不包含_id
).ToList();
修改和删除
单条修改UpdateOne
//将张三的年龄改成18
collection.UpdateOne(filter.Eq("name", "张三"), update.Set("age", 18));
批量修改UpdateMany
//将所有人的年龄改成18
collection.UpdateMany(filter.Empty, update.Set("age", 18));
单条删除DeleteOne
//删除所有name为张三的记录
collection.DeleteOne(filter.Eq("name", "张三"));
批量删除DeleteMany
//删除所有年龄大于18的记录
DeleteResult result = collection.DeleteMany(filter.Gt("age", 18));
注意:单条删除是如果给定集合有多条记录,不会报错,而会直接删除第一条记录
类型映射
映射方式
给定泛型则会自动映射
//获取collection时给定泛型
var collection = mydb.GetCollection<Userinfo>("userinfos");
var filter = Builders<Userinfo>.Filter;
var sort = Builders<Userinfo>.Sort;
使用属性
- BsonId修饰的字段对应BsonDocument中的_id
- BsonDefaultValue(value)用于指定默认值
- BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性
- BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性
- BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段
使用LINQ
引用usingMongoDB.Driver.Linq后,使用collection.AsQueryable()获取IMongoQueryable
List<Userinfo> userList1 = (from user in userCollection.AsQueryable()
where user.age > 22
select user).ToList();
List<Userinfo> userList2= userCollection.AsQueryable().Where(s => s.age > 22).ToList();