当前位置: 首页 > news >正文

.net core 6 集成和使用 mongodb

1、安装包 MongoDB.Driver

2、定义顶层类

/// <summary>
/// monggodb规范
/// </summary>
public abstract class MongoDBToolBase
{
    /// <summary>
    /// 客户端
    /// </summary>
    protected MongoClient mongoClient { get; private set; }
    /// <summary>
    /// 数据库
    /// </summary>
    protected IMongoDatabase? database;

    /// <summary>
    /// 构造
    /// </summary>
    /// <param name="conn"></param>
    protected MongoDBToolBase(string conn) {
        this.mongoClient = new MongoClient(conn);
    }
}

3、定义操作类

/// <summary>
/// MongoDB 操作类
/// </summary>
public class MongoDBTool<T> : MongoDBToolBase where T : class
{
    /// <summary>
    /// 构造
    /// </summary>
    public MongoDBTool(string conn) : base(conn)
    {
        List<Attribute> attributes
            = typeof(T).GetAttribute().FindAttributeEntity<MongoDBDatabase>();

        if (attributes.Any())
        {
            this.database = this.mongoClient.GetDatabase(((MongoDBDatabase)attributes.First()).name);
        }
        else
        {
            throw new Exception("未找到MongoDBDatabase注解");
        }
    }

    /// <summary>
    /// 得到值
    /// 一个条件
    /// </summary>
    /// <param name="collection">表名</param>
    /// <param name="colName">列名</param>
    /// <param name="value">值</param>
    /// <returns></returns>
    public string GetOneCol(string collection, string colName, string value)
    {
        return this.database?
            .GetCollection<T>(collection)
            .Find<T>(Builders<T>.Filter.Eq(colName, value))
            .ToEnumerable<T>()
            .FirstOrDefault()?
            .ToJson()
            ?? string.Empty;
    }
}

4、定义一个注解,映射mongodb的数据库名称

/// <summary>
/// MongoDB数据库名称
/// </summary>
public class MongoDBDatabase : Attribute
{
    /// <summary>
    /// 名称
    /// </summary>
    public string name { get; set; }

    /// <summary>
    /// 构造
    /// </summary>
    /// <param name="name"></param>
    public MongoDBDatabase(string name)
    {
        this.name = name;
    }
}

5、定义一个实体,映射数据库表字段并且关联对应的数据库

/// <summary>
/// 测试表
/// </summary>
[MongoDBDatabase("test")]
public class MongodbTestModel
{
    /// <summary>
    /// mongoid
    /// </summary>
    public ObjectId _id { get; set; }
    /// <summary>
    /// 名称
    /// </summary>
    public string name { get; set; } = string.Empty;
    /// <summary>
    /// 密码
    /// </summary>
    public string password { get; set; } = string.Empty;
    /// <summary>
    /// 备注
    /// </summary>
    public string rem {  get; set; } = string.Empty;
}

6、ioc注入

//注入mongodb单实例
builder.Services.AddSingleton(new MongoDBTool<MongodbTestModel>(builder.Configuration.GetValue<string>("mongodb")));

7、配置文件

"mongodb": "mongodb://username:password@localhost:27017/?authSource=admin"

8、扩展的注解工具类

/// <summary>
/// 注解工具
/// </summary>
public static class AttributeTool
{
    /// <summary>
    /// 获取注解
    /// </summary>
    /// <param name="cls"></param>
    /// <returns></returns>
    public static List<Attribute> GetAttribute(this Type cls)
    {
        // 获取所有自定义特性(包括注解)
        return cls.GetCustomAttributes().ToList();
    }

    /// <summary>
    /// 看看是否存在有对应注解实体
    /// 存在则返回
    /// </summary>
    /// <typeparam name="T">返回对应的实体数据</typeparam>
    /// <param name="attributes"></param>
    /// <returns></returns>
    public static List<Attribute> FindAttributeEntity<T>(this List<Attribute> attributes)
    {
        List<Attribute> temp = new List<Attribute>();

        Attribute? attribute = attributes.FirstOrDefault(attr =>
        {
            return attr.GetType() == typeof(T);
        });
        
        if (attribute?.IsDefaultAttribute() ?? true)
        {
            return temp;
        }

        temp.Add(attribute);
        
        return temp;
    }
}

9、接口

/// <summary>
/// 查询
/// </summary>
/// <returns></returns>
[HttpPost("search/{name}")]
public string SearchData([FromServices] MongoDBTool<MongodbTestModel> mongoDBTool, string name)
{
    return mongoDBTool.GetOneCol("test", "name", name);
}

都这样了还有什么好说的

附加操作

/// <summary>
/// 插入一条数据
/// </summary>
public void InsertOne(T mongodb)
{List<Attribute> attributes= typeof(T).GetAttribute().FindAttributeEntity<MongoDBCollection>();if (!attributes.Any()){return;}this.database?.GetCollection<BsonDocument>(((MongoDBCollection)attributes.First()).name).InsertOne(mongodb.ToBsonDocument());
}/// <summary>
/// 插入多条数据
/// </summary>
public void InsertMul(List<T> mongodb)
{List<Attribute> attributes= typeof(T).GetAttribute().FindAttributeEntity<MongoDBCollection>();List<BsonDocument> collection = new List<BsonDocument>();if (!attributes.Any()){return;}mongodb.ForEach(mo =>{collection.Add(mo.ToBsonDocument());});this.database?.GetCollection<BsonDocument>(((MongoDBCollection)attributes.First()).name).InsertMany(collection);
}/// <summary>
/// 得到值
/// 一个条件
/// </summary>
/// <param name="collection">表名</param>
/// <param name="colName">列名</param>
/// <param name="value">值</param>
/// <returns></returns>
public string GetOneCol(string collection, string colName, string value)
{return this.database?.GetCollection<T>(collection).Find<T>(Builders<T>.Filter.Eq(colName, value)).ToEnumerable<T>().FirstOrDefault()?.ToJson()?? string.Empty;
}/// <summary>
/// 得到值
/// 多个条件
/// </summary>
/// <param name="collection">表名</param>
/// <param name="colName">列名</param>
/// <param name="value">值</param>
/// <returns></returns>
public string GetOneMul(string collection, string colName, string value)
{FilterDefinition<T> filter = Builders<T>.Filter.And(Builders<T>.Filter.Eq("password", "77"),Builders<T>.Filter.Or(Builders<T>.Filter.Eq(colName, value), Builders<T>.Filter.Eq(colName, "几个")));List<T>? list = this.database?.GetCollection<T>(collection).Find<T>(filter).ToList();return list?.ToJson() ?? string.Empty;
}

相关文章:

.net core 6 集成和使用 mongodb

1、安装包 MongoDB.Driver 2、定义顶层类 /// <summary> /// monggodb规范 /// </summary> public abstract class MongoDBToolBase { /// <summary> /// 客户端 /// </summary> protected MongoClient mongoClient { get; private …...

07-微服务getaway网关详解

一、初识网关 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例…...

MS2660:L1 频段卫星导航射频前端低噪声放大器芯片

MS2660 是一款具有高增益、低噪声系数的低噪声放 大器&#xff08;LNA&#xff09;芯片&#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造&#xff0c;封装采用 2 mm 2 mm …...

微信小程序防止截屏录屏

一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露&#xff0c;给小程序添加一个水印浮层。这样即使被截图或者拍照&#xff0c;也能轻松地确定泄露的源头。效果图如下&#xff1a; 代码…...

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP...

物联网介绍

阅读引言&#xff1a; 本文从多方面叙述物联网的定义以及在物联网当中的各种通信的介绍。 一、物联网的定义 1.1 通用的定义 物联网&#xff08;Internet of Things&#xff0c;IOT&#xff1b;也称为Web of Things&#xff09;是指通过各种信息传感设 备&#xff0c;如传感器、…...

Flume 之自定义Sink

1、简介 前文我们介绍了 Flume 如何自定义 Source&#xff0c; 并进行案例演示&#xff0c;本文将接着前文&#xff0c;自定义Sink&#xff0c;在这篇文章中&#xff0c;将使用自定义 Source 和 自定义的 Sink 实现数据传输&#xff0c;让大家快速掌握Flume这门技术。 2、自定…...

【1】SM4 CBC-MAC 机制

0x01 题目 MSG1: e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2 MAC1: 0712c867aa6ec7c1bb2b66312367b2c8 ----------------------------------------------------- MSG2: d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719 MAC2: 4366…...

响应式编程Reactor API大全(下)

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…...

【STM32】HAL库的STOP低功耗模式UART串口唤醒,解决首字节出错的问题(全网第一解决方案)

【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;解决首字节出错的问题&#xff08;全网第一解决方案&#xff09; 前文&#xff1a; 【STM32】HAL库的STOP低功耗模式UART串口唤醒&#xff0c;第一个接收字节出错的问题&#xff08;疑难杂症&#xff09; 目前已解决 …...

Python 语法糖

一、基本概念 语法糖&#xff0c;可以理解为&#xff1a;“甜蜜” 的便捷语法。 它是编程语言为程序提供的更简洁、更易读的语法实现的语法结构&#xff0c;它并不影响语言的功能&#xff0c;仅仅是一种更便捷的书写方式。 这就像你制作蛋糕时&#xff0c;使用现代烤箱而不是…...

一个小程序跳转到另一个小程序中如何实现

小程序 保证两个小程序是一样的主体才可以跳转。怎么知道是不是同样的主体呢&#xff1f; 小程序的后台管理-设置-基本设置-基本信息。查看主体信息。 跳转 <button clicktoOtherMini()>跳转到另一个小程序</button> function toOtherMini(){wx.navigateToMini…...

STM32+HAL库驱动ADXL345传感器(SPI协议)

STM32HAL库驱动ADXL345传感器&#xff08;SPI协议&#xff09; ADXL345传感器简介实物STM32CubeMX配置SPI配置片选引脚配置串口配置 特别注意&#xff08;重点部分&#xff09;核心代码效果展示 ADXL345传感器简介 ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加…...

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…...

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX&#xff1a;hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…...

宝塔发布网站问题汇总和记录

1、添加网站站点后打不开 解决办法&#xff0c;关闭防跨站攻击2 2、laravel项目部署到linux的时候出现The stream or file "/home/www/storage/logs/laravel.log" could not be opened in append mode 给目录加权限 chmod -R 777 storage 3、Class "Redis"…...

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …...

自动化网络监控:每分钟自动检测网站可用性

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…...

Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的微…...

MSSQL行转列、列转行

行转列 SELECT * FROM student PIVOT ( SUM(score) FOR subject IN (语文, 数学, 英语) ) AS PivotedData; 列转行 SELECT * FROM student1 UNPIVOT ( score FOR subject IN ("语文","数学","英语") )AS PivotedData;...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

自定义线程池1.2

自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本&#xff0c;将线程池中的线程数量交给使用者决定&#xff0c;并且将线程的创建延迟到任务提交的时候&#xff0c;在本文中我们将对这个版本进行如下的优化&#xff1a; 在新建线程时交给线程一个任务。让线程在某种情况下…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...

WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署

一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件&#xff0c;支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约&#xff0c;并部署到链上&#xff08;测试网或主网&#xff09;。 部署过程…...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...

我认为STM32输入只分为模拟输入 与 数字输入

核心概念解析 模拟输入 (Analog Input) 设计目的&#xff1a;直接连接模拟信号&#xff08;如ADC采集电压、温度传感器输出&#xff09; 硬件行为&#xff1a; ✅ 断开内部数字电路&#xff08;施密特触发器禁用&#xff09; ✅ 信号直通模拟外设&#xff08;如ADC、运放&…...