MongoDB +MongoDB在.net Core中的应用
一、什么是MongoDB
- MongoDB是一个基于
分布式文件存储的数据库 - MongoDB是一个介于
关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MonfoDB创建新连接参考:
https://blog.csdn.net/lavendersue/article/details/104924258?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104924258-blog-100642715.pc_relevant_antiscanv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104924258-blog-100642715.pc_relevant_antiscanv4&utm_relevant_index=1
创建一个新的连接
1、任意打开一个调出可以编写代码的地方

二、MongoDB在.net Core 6.0中的应用
.net core操作mongoDB
https://blog.csdn.net/only_yu_yy/article/details/78882446
1、编写基层类,用于生成对应编辑库的MongoDB上下文类使用(不用ef那种dbset<>了)–并安装所需包
//要这些基础的设施是因为ef他原本就封好了,但是MongoDB没有所以需要我们自己写下
MongoDBContextOptions
生成一个用与存放字符串信息与所要连接的MongoDB数据库名称信息的类—对应这里的信息数据是通过后面和ef上下文/dapper上下文在一起的那个类通过构造传来的

public class MongoDBContextOptions
{
public string Configuration { get; set; }//连接MongoDB字符串
public string DatabaseName { get; set; } //连接对应的数据库名称--MongoDB需要指定连接的数据库
public MongoDBContextOptions Value { get { return this; } }
}
MongoDBContext
根据MongoDBContextOptions类中的信息,配置上下文,起连接,取连接的数据库–这样目的就是实现我们为什么在ef中直接用上下文.表.add就可以对对应数据库,对应表实现添加

public class MongoDBContext
{
//此构造方法主要目的是接连接字符串的配置和要操作哪个数据库
//安装包MongoDB.Driver
private MongoClient _mongoClent;//mongodb的连接
private readonly MongoDBContextOptions _options; //使用强类型来接受配置信息
private IMongoDatabase _database;
/// <summary>
/// 构造函数中接收传过来的配置信息(连接字符串+操作的对应数据库)options
/// </summary>
/// <param name="optionsAccessor"></param>
protected MongoDBContext(IOptions<MongoDBContextOptions> optionsAccessor)
{
_options = optionsAccessor.Value;
_mongoClent = new MongoClient(_options.Configuration); //通过options中存放的连接字符串, 起连接
_database = _mongoClent.GetDatabase(_options.DatabaseName); //通过options中存放的数据库名称,获取数据库
}
/// <summary>
/// 获取mongodb 的连接
/// </summary>
public MongoClient MongoClent { get { return _mongoClent; } }
/// <summary>
/// 获取连接的数据库
/// </summary>
public IMongoDatabase Database { get { return _database; } }
}
MongoDBContextServiceCollectionExtensions
一个扩展,用于把MongoDB注册到容器中
–因为在Programe需要注册,并且要把连接字符串给带过来,所以写个扩展方法用于注册(与ef注册时用的builder.ServicesAddDbContext()一个东西,只不过人家封装好了的)
public static class MongoDBContextServiceCollectionExtensions
{
/// <summary>
/// 是一个扩展,用于把MongoDB注册到容器中
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="services"></param>
/// <param name="setupAction"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
public static IServiceCollection AddMongoDBContext<T>(this IServiceCollection services, Action<MongoDBContextOptions> setupAction) where T : MongoDBContext
{
if (services == null)
{ throw new ArgumentNullException(nameof(services)); }
if (setupAction == null) { throw new ArgumentNullException(nameof(setupAction)); }
services.Configure(setupAction);
services.AddScoped<T>();
return services;
}
}
2、根据当前的需求生成一个用于对跟踪信息中所需的经、纬度、合同等信息编辑的MongoDB上下文
–这一步操作就相当于ef中在一个dbcontext中很多个dbset<>,然后用的时候调用对应的映射–实现对对应表操作
–而此时在MongoDB这里就是跟据前面配置的连接字符串/与库,传给上面的MongoDBContextOptions类,再由其一层一层传封装好MongoDB上下文就可以直接对对应库表编辑了
/// <summary>
/// mongoDb上下文 合同库的实现
/// </summary>
public class ContractDbMongoDBContext : MongoDBContext
{
public ContractDbMongoDBContext(IOptions<MongoDBContextOptions> optionsAccessor) : base(optionsAccessor)
{
}
}
3、在Progame中注册下合同MongoDB上下文

//注册mongodb上下文
builder.Services.AddMongoDBContext<ContractDbMongoDBContext>(options => {
options.Configuration = builder.Configuration.GetSection("MyConfig")["MongoDBConnection"];
options.DatabaseName = "contract_db";
});
4、appsettings中编写MongoDB连接字符串 
"MongoDBConnection": "mongodb://admin:123456@127.0.0.1:27017"
5、注入MongoDB上下文
1、注入上下文类

private ContractDbMongoDBContext _ContractDbMongoDBContext;
/// <summary>
/// 注入上下文类
/// </summary>
/// <param name="db">ef类上下文类</param>
/// <param name="ContractDbMongoDBContexts">MongoDb上下文类</param>
public ShipperContractRepository(ProjectDbContext db, ContractDbMongoDBContext ContractDbMongoDBContexts) : base(db)
{
_ContractDbMongoDBContext = ContractDbMongoDBContexts;
}
6、使用MongoDB
.net core操作mongoDB
https://blog.csdn.net/only_yu_yy/article/details/78882446
1、建立对应所需model

2.、对应仓储层实现对MongoDB的操作–插入数据

/// <summary>
/// //合同跟踪给Mongodb添加数据 添加运输合同车辆坐标
/// </summary>
/// <param name="cId">合同id</param>
/// <param name="lng">经度</param>
/// <param name="lat">维度</param>
/// <returns></returns>
public string ContractFreightLineLngAndLatAdd(int cId, double lng, double lat)
{
//1、从MongoDB上下文获取或者创建放置对应信息的库(sql中的库)
//1-1数据库不存在,也没有关系,它会在首次使用数据库的时候进行自动创建。
var db = _ContractDbMongoDBContext.Database;
//获取或者创建线路跟踪集合
//2、我们可以调用database的GetCollection<TDocument> 方法来获取数据集,(sql中的表)
//2-1其中如果数据是预先定义好的可以在<输入数据的类型> ,如果是没有定义好的,
//可以使用BsonDocument类型,BsonDocument表示没有预定于的模式。
//2-2我们将获取到上面“db”所对应的数据库中的“freight_line”集合,
//即使“freight_line”集合不存在也没有关系,
//同数据库一样,若数据集不存在,会自动创建该数据集。
var collection = db.GetCollection<ContractFreightLine>("freight_line");
//实例一个集合用于添加
ContractFreightLine ContractFreightLineInfo = new ContractFreightLine()
{
id = new ObjectId(),
cid = cId,
lng = lng,
lat = lat,
created_date = DateTime.Now
};
//根据MongoDB上下文插入数据--向集合中插入数据
//InsertOne(同步插入)或InsertOneAsync(异步插入)方法。
collection.InsertOne(ContractFreightLineInfo);
//返回主键ID
return ContractFreightLineInfo.id.ToString();
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/267189.html