当前位置: 首页 > 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;...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...