当前位置: 首页 > 编程日记 > 正文

c#操作mongodb数据库工具类

新建c#项目,在nuget中引入MongoDB.Driver驱动,然后新建一个MongoDBToolHelper类,将下面代码复制进去

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hy.DBUtility.Common
{
    /// <summary>
    /// mongodb数据库帮助类
    /// </summary>
    public class MongoDBToolHelper
    {
        /// <summary>
        /// 数据库名称
        /// </summary>
        public string ConnectionNamse { get; set; }

        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public string PBConStr { get; set; } = "";

        public string connStr
        {
            get
            {
                try
                {
                    string database = "";
                    var db = ConfigurationManager.ConnectionStrings[this.ConnectionNamse];
                    if (db != null)
                    {
                        database = db.ConnectionString;
                    }
                    else
                    {
                        database = ConfigurationManager.AppSettings[this.ConnectionNamse];
                    }
                    if (!string.IsNullOrEmpty(database))
                    {
                        return database;
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(PBConStr))
                        {
                            database = PBConStr;
                        }
                    }
                    return database;
                }
                catch (Exception ex)
                {
                    return "";
                }
            }
        }

        /// <summary>
        /// 获取数据库
        /// </summary>
        /// <returns></returns>
        public MongoDatabase GetMongoDB()
        {
            return new MongoClient(connStr).GetServer().GetDatabase(ConnectionNamse);
        }

        public MongoCollection<BsonDocument> GetCol<T>()
        {
            return GetMongoDB().GetCollection(typeof(T).Name);
        }

        /// <summary>
        /// 新增
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        public T Add<T>(T entity)
        {
            var col = GetCol<T>();
            col.Insert(entity);
            return entity;
        }

        /// <summary>
        /// 编辑
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="id"></param>
        public void Update<T>(T entity, string id)
        {
            var col = GetCol<T>();
            ObjectId tId = new ObjectId(id);
            BsonDocument bsd = BsonExtensionMethods.ToBsonDocument(entity);
            IMongoQuery query = Query.EQ("_id", tId);
            col.Update(query, new UpdateDocument(bsd));
        }

        /// <summary>
        /// 编辑
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="id"></param>
        public void Update<T>(IMongoQuery query, IMongoUpdate update, bool updateMulti = false)
        {
            var col = GetCol<T>();
            if (updateMulti)
            {
                col.Update(query, update, UpdateFlags.Multi);// 更新多条
                return;
            }
            col.Update(query, update);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dics"></param>
        public void Delete<T>(Dictionary<string, object> dics)
        {
            var col = GetCol<T>();
            var query = new QueryDocument(dics);
            col.Remove(query);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dics"></param>
        public void Delete<T>(IMongoQuery query)
        {
            var col = GetCol<T>();
            col.Remove(query);
        }

        /// <summary>
        /// 删除所有数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dics"></param>
        public void DeleteAll<T>()
        {
            var col = GetCol<T>();
            col.RemoveAll();
        }

        /// <summary>
        /// 删除
        /// remark:根据ObjectId删除
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="id"></param>
        public void Delete<T>(string id)
        {
            var col = GetCol<T>();
            ObjectId tId = new ObjectId(id);
            IMongoQuery query = Query.EQ("_id", tId);
            col.Remove(query);
        }

        /// <summary>
        /// 查找单个实体数据
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public T Find<T>(IMongoQuery query)
        {
            var col = GetCol<T>();
            return col.FindAs<T>(query).FirstOrDefault();
        }

        /// <summary>
        /// 查找单个实体数据
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public T FindById<T>(string id)
        {
            var col = GetCol<T>();
            ObjectId tId = new ObjectId(id);
            BsonDocument bsonDocument = col.FindOneById(tId);
            T t = BsonSerializer.Deserialize<T>(bsonDocument);
            return t;
        }

        /// <summary>
        /// 查询全部
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public List<T> QueryList<T>()
        {
            var col = GetCol<T>();
            var result = col.FindAllAs<T>();
            return result.ToList();
        }

        /// <summary>
        /// 根据条件查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dics"></param>
        /// <returns></returns>
        public List<T> QueryList<T>(Dictionary<string, object> dics)
        {
            var col = GetCol<T>();
            var query = new QueryDocument(dics);
            var result = col.FindAs<T>(query);
            return result.ToList<T>();
        }

        /// <summary>
        /// 分页查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public List<T> QueryPageList<T>(int pageIndex, int pageSize, IMongoQuery query, string[] sortFields)
        {
            var col = GetCol<T>();
            var result = col.FindAs<T>(query).SetSortOrder(SortBy.Descending(sortFields))
                            .Skip((pageIndex - 1) * pageSize)
                            .Take(pageSize)
                            .ToList();
            return result;
        }

        /// <summary>
        /// 查询条数
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public long Count<T>(IMongoQuery query = null)
        {
            var col = GetCol<T>();
            long n = col.Count(query);
            return n;
        }
    }

    /**
     * 项目引用:MongoDB.Driver
     * 操作集合实体案例:
     *    /// <summary>
          /// 注意:实体名就是集合名称,必须一致
          /// </summary>
          [BsonIgnoreExtraElements]
          public class TEST
          {
              public ObjectId _id { get; set; }
              public string OrderId { get; set; }
              public string OrderCode { get; set; }
          }

         连接字符串配置:
         <appSettings>
            <add key="TEST" value="mongodb://TEST:123456@127.0.0.1:27017/TEST"/>
         </appSettings>

         查询调用方式:
          //var sd = MongoDBConfig.MongoDBToolHelper_TEST.QueryList<TEST>();
            //var sd = MongoDBConfig.MongoDBToolHelper_TEST.QueryPageList<TEST>(1, 10, null, new string[] { "OrderId" });
            //var mdoel = MongoDBConfig.MongoDBToolHelper_TEST.Find<TEST>( Query.EQ("OrderId", "111"));
            var mdoel = MongoDBConfig.MongoDBToolHelper_TEST.FindById<TEST>("222");

        注意:所有操作的T实体,实体名称必须与集合名称一致
         
     */
}

下面是mongodb配置类,同上操作,这里只封装了基本的操作,如果有其他的操作可以自行封装

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hy.DBUtility.Common
{
    /// <summary>
    /// mongodb数据库配置类
    /// </summary>
    public class MongoDBConfig
    {
        private static MongoDBToolHelper _MongoDBToolHelper_TEST;
        public static MongoDBToolHelper MongoDBToolHelper_TEST
        {
            get
            {
                if (_MongoDBToolHelper_TEST == null)
                {
                    _MongoDBToolHelper_TEST = new MongoDBToolHelper();
                    _MongoDBToolHelper_TEST.ConnectionNamse = "TEST";
                }
                return _MongoDBToolHelper_TEST;
            }
        }
    }
}

 

相关文章:

Redis查看集群状态有节点显示fail,连接失败

现有6台redis,为集群,3主3从,由于两台服务器故障重装系统之后进行重新安装2台redis,安装完成之后。查询当前redis状态,发现有存留的节点,但连接为fai。将新建的两台redis启动,保证配置文件一致。查询fail节点的node_id。将新建的两台redis设为从节点。登录新建的两台redis服务器。先通过ID删掉无用的节点。

SpringBoot整合Kafka (二)

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

SpringBoot整合Kafka (一)

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。

深入详解高性能消息队列中间件 RabbitMQ

在进行系统设计的时候,各个模块、服务器之间为了实现数据的交互,通常是建立连接通过发送消息来进行。如果将他们一一建立连接,就会出现链路太多,每一条链路都必须感知对端等问题。此场景下消息将非常混乱,后期维护也将非常痛苦。

ModuleNotFoundError: No module named ‘config‘

当你在Python代码中看到类似"ModuleNotFoundError: No module named 'config'"的错误消息时,意味着你尝试导入一个名为'config'的模块,但Python无法找到该模块

【云原生基础】了解云原生,什么是云原生?

云原生(Cloud-Native)是一种软件开发和部署方法论,旨在利用云计算、容器化、微服务架构和持续交付等现代技术和最佳实践,以构建、部署和运行可伸缩、高可用、弹性和易于管理的应用程序。云原生应用程序旨在充分发挥云计算的潜力,以更好地满足快速发展的数字业务需求。容器化:云原生应用程序通常使用容器技术(如Docker)进行封装,使应用程序及其依赖项可以在不同环境中一致运行。容器化提供了隔离、可重复部署和快速部署的好处。

【微服务】mysql + elasticsearch数据双写设计与实现

在很多电商网站中,对商品的搜索要求很高,主要体现在页面快速响应搜索结果。这就对服务端接口响应速度提出了很高的要求。

Python异常处理:try、except、else 和 finally 的使用指南

Python异常处理:try、except、else 和 finally 的使用指南

HarmonyOS 数据管理与应用数据持久化(二)

文章浏览阅读31次。关系型数据库基于 SQLite 组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。

HarmonyOS数据管理与应用数据持久化(一)

文章浏览阅读599次。一.

Ubuntu系统下怎么安装Docker(linux安装docker教程)

更新系统软件包 在安装 Docker 前,首先需要更新系统软件包,确保系统上的软件都是最新的版本

python实战讲解之使用Python批量发送个性化邮件

通过上述Python脚本,我们可以批量发送个性化的邮件。我们首先设置发件人邮箱和密码,然后指定SMTP服务器和端口号。接下来,我们读取包含员工信息的Excel文件,并获取唯一的员工姓名列表和对应的邮箱地址。然后,我们遍历员工数据,并为每个员工创建邮件,附带相应的附件。最后,我们通过SMTP服务器发送邮件,并在发送完成后删除生成的员工数据文件。

什么是加密?浅谈MD5加密

文章浏览阅读108次。加密解密是一种通过使用密码算法对信息进行转换,以使其在传输或存储过程中变得不可读或难以理解,从而保护信息的安全性和隐私性的过程。加密是将明文(原始文本)转换为密文(加密后的文本)的过程。在加密过程中,使用密钥和特定的算法来改变原始文本的形式,使其在未经授权的情况下无法理解。只有持有正确密钥的人才解密是将密文转换回明文的过程。数字摘要算法(Digital Digest Algorithm)是一种加密算法,用于将任意长度的数据转换为固定长度的摘要(也称为哈希值)。

Python自动化处理Excel数据

需求描述:数据格式如下所示,需要分离出2023年7月1号之后的数据明细 数据核对与处理:从Excel文件中提取特定日期后的签收数据 1. 引言 在实际数据处理和分析过程中,经常会遇到需要从大量数据中提取出特定日期范围内的信息的需求。本文将介绍如何使用Python的pandas库来处理Excel文件,

Linux 环境下 安装 Elasticsearch 7.13.2

文章浏览阅读42次。借公司的 centos 7 服务器,搭建一个 Es,正好熟悉熟悉 Linux 下的安装流程。

基于 MySQL 多通道主主复制的机房容灾方案

文章中介绍了多种 MySQL 高可用技术,并介绍了根据自身需求选择多通道主主复制技术的过程和注意事项。

C#利用一段字节序列构建一个数组对象

《.NET中的数组在内存中如何布局? 》介绍了一个.NET下针对数组对象的内存布局。既然我们知道了内存布局,我们自然可以按照这个布局规则创建一段字节序列来表示一个数组对象,就像《以纯二进制的形式在内存中绘制一个对象》构建一个普通的对象,以及《你知道.NET的字符串在内存中是如何存储的吗?》构建一个字

【卷积神经网络】YOLO 算法原理

文章浏览阅读128次。在计算机视觉领域中,目标检测(Object Detection)是一个具有挑战性且重要的新兴研究方向。目标检测不仅要预测图片中是否包含待检测的目标,还需要在图片中指出它们的位置。2015年,Joseph Redmon, Santosh Divvala 等人提出第一个 YOLO 模型,该模型具有实时性高、支持多物体检测的特点,已成为目标检测领域热门的研究算法。本文主要介绍 YOLO 算法及其基本原理。

C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序

文章浏览阅读27次。C#,数值计算——分类与推理Svmlinkernel的计算方法与源程序

MyBatis-Plus 实战教程四 idea插件

文章浏览阅读269次。在未引入分页插件的情况下,MybatisPlus是不支持分页功能的,IService和BaseMapper中的分页方法都无法正常起效。其中缺少的仅仅是分页条件,而分页条件不仅仅用户分页查询需要,以后其它业务也都有分页查询的需求。在刚才的代码中,从PageQuery到MybatisPlus的Page之间转换的过程还是比较麻烦的。这里用到了分页参数,Page,即可以支持分页参数,也可以支持排序参数。在查询出分页结果后,数据的非空校验,数据的vo转换都是模板代码,编写起来很麻烦。

测开不得不会的python之类(class)的定义和使用

文章浏览阅读147次。我们经常讲‘物以类聚,人以群分’,这里的类指相同属性的一类东西,而python中的类(class)也可以这么理解为相同属性的一些函数聚在一起,而通过__init__()初始化方法可以传入不同参数得到不同的实例对象,进而每个不同实例对象的一些属性值会不同。比如很多书籍经常讲到的例子Car类,他们属性可以有颜色,品牌,性价比等。

STM32F3系列 ADC采样单端采样模式(基于LL库)

STM32F3系列 ADC 单端采样(基于LL库) 芯片型号:STM32f303RBT6 开发软件:MDK5 &amp; CubeMX &amp; VS Code 目录 目录STM32F3系列 ADC 单端采样(基于LL库)目录引言1 基础知识1.1ADC转换基本流程1.2 时钟树1.3 关键参数1

【剑指offer|图解|双指针】移除元素 + 合并两个有序数组

文章浏览阅读186次,点赞23次,收藏17次。本文结合两道题目对顺表的考察方向有的初步了解,每个题都有详细的图文讲解,更多精彩内容等你来阅读哦!

鸿蒙ArkUI-X跨端应用开发,一套代码构建多平台应用

文章浏览阅读164次。ArkUI是一套构建分布式应用的声明式UI开发框架。它具备简洁自然的UI信息语法、丰富的UI组件、多维的状态管理,以及实时界面预览等相关能力,帮助您提升应用开发效率,并能在多种设备上实现生动而流畅的用户体验。详情可参考ArkUI框架介绍ArkUI-X进一步将ArkUI扩展到了多个OS平台:目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。

【Java集合】了解集合的框架体系结构及常用实现类,从入门到精通!

前言 通过Java基础的学习,我们掌握了主要的Java语言基本的语法,同时了解学习了Java语言的核心-面向对象编程思想。 从集合框架开始,也就是进入了java这些基础知识及面向对象思想进入实际应用编码的过程,通过jdk中集合这部分代码的阅读学习,就能发现这一点。 本计划在这篇中把框架体系和一些集合

MySQL中的 增 删 查 改(CRUD)

文章浏览阅读1.8k次,点赞60次,收藏56次。insert into 表名 value(数据,数据),.......;可以单行,多行插入。​为查询结果的列取别名select 表达式/列名as 别名 from 表名;去重:DISTINCTselect distinct 单列/多列 from 表名;会去除查询结果中的重复项(只保留一项)select 条件查询的执行顺序遍历表中的每个记录把当前记录的值带入条件,根据条件进行筛选如果这条记录满足条件,保留并进行列上的表达式的计算如果有 order by 会在所有行都被获取到之后(表​

BETWEEN操作符:选取介于两个值之间的数据范围内的值

文章浏览阅读246次,点赞6次,收藏5次。BETWEEN操作符:选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

【Java 基础篇】Java网络编程:文件下载详解

文件下载是指从一个网络服务器或远程位置传输文件到本地计算机或设备的过程。这些文件可以是文本文件、图像、音频、视频或任何其他类型的数据文件。文件下载在Web浏览器、移动应用程序和桌面应用程序中都是常见的操作。在Java中,您可以使用各种网络协议(如HTTP、FTP、SFTP等)来执行文件下载操作。下面我们将以HTTP协议为例,介绍如何使用Java进行文件下载。本文介绍了如何使用Java进行文件下载,以及文件下载的一些进阶功能和注意事项。

【Java 基础篇】Java网络编程:下载进度监控实现详解

下载进度监控是一种用户界面元素或功能,用于显示文件下载的实时进度。通常以百分比的形式显示已下载的数据量与总数据量的比例,让用户知道下载的进展情况。实现下载进度监控的关键是获取已下载数据的大小并将其与总数据大小进行比较,然后将结果以可视化的方式呈现给用户。下载进度监控是提高文件下载体验的重要组成部分。通过合理设置Range头部请求,并在用户界面上显示下载进度,您可以实现有效的下载进度监控功能。此外,要注意异常处理和性能,以提供更好的用户体验。

【Java 基础篇】Java Lambda表达式详解

Lambda表达式,也称为闭包,是一种匿名函数,它可以传递到方法作为参数,并且可以在方法中使用。它是Java 8引入的一个新特性,用于简化代码的编写,特别是在使用函数式接口时。匿名性:Lambda表达式没有显式的名称,因此可以被当做一种匿名函数使用。简洁性:Lambda表达式可以大大减少代码的冗余,使代码更加简洁。传递性:Lambda表达式可以作为参数传递给方法,从而实现更灵活的代码组织。除了Java标准库中的函数式接口,您还可以定义自己的函数式接口,以适应特定的需求。// 结果为8。