MongoDB +MongoDB在.net Core中的应用+封装MongoDB上下文类

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、任意打开一个调出可以编写代码的地方

  

 

 创建一个用户:

 

--没有会引起错误: 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();
        }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-06-10 08:19  じ逐梦  阅读(926)  评论(0编辑  收藏  举报