MongoDB +MongoDB在.net Core中的应用+封装MongoDB上下文类
MongoDB +MongoDB在.net Core中的应用
一、什么是MongoDB
- MongoDB是一个基于
分布式文件存储
的数据库 - MongoDB是一个介于
关系数据库
和非关系数据库
之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MonfoDB创建新连接参考:
创建一个新的连接
1、任意打开一个调出可以编写代码的地方
创建一个用户:
--没有会引起错误: Unable to authenticate using sasl protocol mechanism SCRAM-SHA-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(); }
本文来自博客园,作者:じ逐梦,转载请注明原文链接:https://www.cnblogs.com/ZhuMeng-Chao/p/16359922.html