ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-06-10 08:31:37  阅读:155  来源: 互联网

标签:Core MongoDB 数据库 连接 options net 上下文 public


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();
        }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:Core,MongoDB,数据库,连接,options,net,上下文,public
来源: https://www.cnblogs.com/ZhuMeng-Chao/p/16359922.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有