C#操作MongoDB,看我这一篇就够了!

2023-11-18

一、准备工作

工欲善其事必先利其器,首先呢咱们得下载好C#程序里面可以驱动mongodb的组件:

走起官网:C#操作mongodb组件下载

菜鸟教程也上一上:mongodb菜鸟教程

dll下载下来之后有这几个,都引用上,不要省,哈哈!个人还是习惯直接下载下来,不走Nget的模式,那玩意菜鸟学不会。

为啥要加上xml呢,这你就不懂了,你难道没发现加了之后使用方法的时候,有了说明了么?就是这么优秀的一个操作。


二、开始实操增删改查

做好准备工作,下面咱们开始实操,把增删改查给你走一遍,看好喽,打起精神!

话不多话,咱先上代码,以后看到只说不做,特别是不放完整源代码的博主,咱们就得讲他耍流氓,咱可不做这类型的人,直接贴代码,优秀的人做事一向就是这么直接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;

namespace MongoDbSpider
{
    /// <summary>
    /// MongoDb 数据库操作类
    /// </summary>
    public class MongoDbHelper
    {
        /// <summary>
        /// 数据库对象
        /// </summary>
        private IMongoDatabase _dataBase;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="conStrMdb">连接字符串</param>
        public MongoDbHelper(string conStrMdb)
        {
            this._dataBase = GetDb(conStrMdb);
        }

        /// <summary>
        /// 若没有,根据传入的数据库名字来生成对应的数据库名,否则,返回db
        /// </summary>
        /// <param name="conStrMdb">数据库连接</param>
        /// <returns></returns>
        public IMongoDatabase GetDb(string conStrMdb)
        {
            var db = new MongoClient(conStrMdb).GetDatabase(new MongoUrlBuilder(conStrMdb).DatabaseName);
            return db;
        }

        /// <summary>
        /// 创建集合对象
        /// </summary>
        /// <param name="collName">集合名称</param>
        ///<returns>集合对象</returns>
        private IMongoCollection<T> GetColletion<T>(string collName)
        {
            return _dataBase.GetCollection<T>(collName);
        }

        /// <summary>
        /// 获取指定数据库集合中的所有的文档
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tableName">表名</param>
        /// <returns></returns>
        public List<T> FindAll<T>(string tableName)
        {
            List<T> list = new List<T>();
            try
            {
                var collection = GetColletion<T>(collName: tableName);
                FilterDefinition<T> filter = Builders<T>.Filter.Empty;
                list = collection.Find<T>(filter).ToList<T>();
            }
            catch(Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.FindAll");
            }
            return list;
        }

        /// <summary>
        /// 插入对象
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="document">插入的对象</param>
        /// <returns>异常返回-101</returns>
        public DbMessage Insert<T>(string collName, T document)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                coll.InsertOne(document);
                return new DbMessage { Ex = string.Empty, iFlg = 1 };
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Insert");
                return new DbMessage { Ex = ex.Message, iFlg = -101 }; 
            }           
        }

        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="documents">要插入的对象集合</param>
        /// <returns>异常返回-101</returns>
        public DbMessage InsertMany<T>(string collName, List<T> documents)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                coll.InsertMany(documents);
                return new DbMessage { Ex = string.Empty, iFlg = documents.Count };
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.InsertMany");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }           
        }

        /// <summary>
        /// 修改文档
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="filter">修改条件</param>
        /// <param name="update">修改结果</param>
        /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
        /// <returns>修改影响文档数,异常返回-101</returns>
        public DbMessage Update<T>(string collName, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update, Boolean upsert = false)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                var result = coll.UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert });
                return new DbMessage { Ex = string.Empty, iFlg = result.ModifiedCount };
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Update");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }
        }

        /// <summary>
        /// 用新对象替换新文档
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="filter">修改条件</param>
        /// <param name="t">新对象</param>
        /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
        /// <returns>修改影响文档数,异常返回-101</returns>
        public DbMessage Update<T>(string collName, Expression<Func<T, Boolean>> filter, T t, Boolean upsert = false)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                BsonDocument document = t.ToBsonDocument<T>();
                document.Remove("_id");
                UpdateDocument update = new UpdateDocument("$set", document);
                var result = coll.UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert });
                return new DbMessage { Ex = string.Empty, iFlg = result.ModifiedCount };
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Update");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }
        }

        /// <summary>
        /// 按BsonDocument条件删除
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="document">文档</param>
        /// <returns>异常返回-101</returns>
        public DbMessage Delete<T>(string collName, BsonDocument document)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                var result = coll.DeleteOne(document);
                return new DbMessage { Ex = string.Empty, iFlg = result.DeletedCount };
            }
            catch(Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Delete");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }
        }

        /// <summary>
        /// 按条件表达式删除
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="predicate">条件表达式</param>
        /// <returns>异常返回-101</returns>
        public DbMessage Delete<T>(string collName, Expression<Func<T, Boolean>> predicate)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                var result = coll.DeleteOne(predicate);
                return new DbMessage { Ex = string.Empty, iFlg = result.DeletedCount };
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Delete");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }          
        }

        /// <summary>
        /// 按检索条件删除(建议用Builders-T构建复杂的查询条件)
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <param name="filter">条件</param>
        /// <returns></returns>
        public DbMessage Delete<T>(string collName, FilterDefinition<T> filter)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                var result = coll.DeleteOne(filter);
                return new DbMessage { Ex = string.Empty, iFlg = result.DeletedCount };
            }
            catch(Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.Delete");
                return new DbMessage { Ex = ex.Message, iFlg = -101 };
            }
        }

        /// <summary>
        /// 查询,复杂查询直接用Linq处理
        /// </summary>
        /// <param name="collName">集合名称</param>
        /// <returns>要查询的对象</returns>
        public IQueryable<T> GetQueryable<T>(string collName)
        {
            try
            {
                var coll = GetColletion<T>(collName);
                return coll.AsQueryable<T>();
            }
            catch (Exception ex)
            {
                CLog.DbLog(ex.Message, "MongoDbHelper.GetQueryable");
                return null;
            }        
        }
    }

    public class DbMessage
    {
        /// <summary>
        /// 反馈数量
        /// </summary>
        public long iFlg { get; set; }
        /// <summary>
        /// 反馈文字描述
        /// </summary>
        public string Ex { get; set; }
    }
}

参考mysql的增删改查逻辑,实现mongodb的,内部实现数据库连接等细节性的东西,外部直接调用,整体来看属于三层结构的思维模式。下面上下实际使用场景的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using ESpider.Spiders.MongoDbSpider;
using MongoDB.Bson;
using MongoDB.Driver;

namespace MongoDbSpider
{
    class MyTest
    {
        public void Fun()
        {
            /*
             * 所有的动作基于BsonDocument操作就对了
             */

            //数据库连接,格式为mongodb://账号:密码@服务器地址:端口/数据库名
            string conStrMdb = "mongodb://test:test@192.168.1.1:8888/test";
            MongoDbSpider.MongoDbHelper mgDbHelper = new MongoDbSpider.MongoDbHelper(conStrMdb);
            var db = mgDbHelper.GetDb(conStrMdb);
            string colName = "person_index";

            //查询,在这之前是没有数据的,自然也就查不出来数据,我们可以先给它插入一条数据
            var cc = db.GetCollection<person_index>(colName);
            var ccList = cc.Find(new BsonDocument()).ToList();
            Console.WriteLine($"【当前集合{colName}数据量】>>>【{ccList.Count}】>>>{DateTime.Now}");
            //建议以模型的方式插入数据,这样子字段类型是可控的
            person_index personIndex = new person_index
            {
                _id系统会自动生成,不要赋值,插入之前移除掉,该字段用于接收模型用
                //_id = null,
                //这里使用Id_避免使用Id可能会与系统的起冲突
                Id_ = 1,
                FullName = "测试名称",
             //mongodb存储的时间是UTC,会跟我们的本地时间相差8个小时。因此这边需要特殊处理一下时间
                CreateTime = DateTime.Now.AddHours(8)
            };
            //转化为BsonDocument是为了方便移除_id
            BsonDocument document = personIndex.ToBsonDocument();
            document.Remove("_id");
            var result = mgDbHelper.Insert(colName, document);
            Console.WriteLine($"【插入】>>>【{result.iFlg}】>>>{DateTime.Now}");

            //现在我们再查询试下,这里可以添加查询条件
            BsonDocument document1 = new BsonDocument();
            document1.Add("Id_", personIndex.Id_);
            document1.Add("FullName", personIndex.FullName);
            var cc1List = cc.Find(document1).ToList();
            for (int i = 0; i < cc1List.Count; i++)
            {
                Console.WriteLine(cc1List[i].ToJson());
            }

            //更新,使用表达式树,实现更新逻辑,注意类型一定要跟字段对应上
            UpdateDocument update = new UpdateDocument("$set", new BsonDocument() { { "CreateTime", DateTime.Now } });
            Expression<Func<person_index, bool>> exp = (s => s.Id_ == personIndex.Id_ && s.FullName == personIndex.FullName);
            var upResult = mgDbHelper.Update(colName, exp, update, false);
            Console.WriteLine($"【更新】>>>【{upResult.iFlg}】>>>{DateTime.Now}");

            //删除操作的话就不演示了,慎用!
            Expression<Func<person_index, bool>> deleteExp = (s => s.Id_ == personIndex.Id_ && s.FullName == personIndex.FullName && s.CreateTime == personIndex.CreateTime);
            //由于我们更新了日期,这里的删除操作应该是不会生效的
            var deleteResult = mgDbHelper.Delete(colName, deleteExp);
            Console.WriteLine($"【删除】>>>【{deleteResult.iFlg}】>>>{DateTime.Now}");
        }

        /// <summary>
        /// 测试模型
        /// </summary>
        private class person_index
        {
            /// <summary>
            /// 系统自带_id
            /// </summary>
            public object _id { get; set; }
            /// <summary>
            /// 自增长id
            /// </summary>
            public long Id_ { get; set; }

            /// <summary>
            /// 全称
            /// </summary>
            public string FullName { get; set; }

            /// <summary>
            /// 创建时间
            /// </summary>
            public DateTime CreateTime { get; set; }
        }
    }
}

结束语:文章描述性的文字说明不多,干货主要体现在代码层面,拿过去就能用的,尤秀娣魜就是折磨滴螚咁!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#操作MongoDB,看我这一篇就够了! 的相关文章

  • 从 mongoDB 获取数据并在 HTML 上显示

    我无法理解如何从 MongoDB 数据库获取数据并将其显示在 HTML 上 我已经设置了数据 这是 server js 文件 const path require path const express require express con
  • Meteor 独特客户端集合的发布/订阅策略

    使用 Meteor 我想知道如何最好地处理共享相同服务器端数据库集合的不同客户端集合 考虑以下示例 我有一个User集合 在我的客户端我有一个好友用户列表我有一个搜索功能 可以对整个用户数据库执行查询 返回一个与查询匹配的用户名列表 在发布
  • 如何访问 Pandas DataFrame 中嵌入的 json 对象?

    TL DR 如果 Pandas DataFrame 中加载的字段本身包含 JSON 文档 那么如何以类似 Pandas 的方式使用它们 目前我直接从 Twitter 库转储 json 字典结果 twython https github co
  • redis能完全取代mysql吗?

    简单的问题 我是否可以使用 redis 而不是 mysql 来处理各种 Web 应用程序 社交网络 地理位置服务等 IT 领域没有什么是不可能的 但有些事情可能会变得极其复杂 将键值存储用于全文搜索之类的事情可能会非常痛苦 另外 据我所知
  • 在节点中使用mongoosejs更新多条记录

    我在使用 mongoosejs 和 Node js 更新多个记录时遇到问题 由于某种原因 即使有多个匹配 我也只更新一条记录 我还注意到回调在 update 之后不会触发 我没有收到任何错误消息 这里发生了什么 Page find stat
  • MongoDB 删除 MapReduce 集合

    由于客户端代码中的错误 mongodb 创建了许多 mr mapreduce 集合 如何将它们全部删除 可能通过掩码 我在交互式 shell 中运行脚本 function f var names db getCollectionNames
  • Spring mongodb 指南针缺少创建的数据/集合

    我使用 spring 将数据保存到数据库 RepositoryRestResource collectionResourceRel operators path operators public interface OperatorsRep
  • Mongoose 多个连接

    目前我的连接有这个代码猫鼬 js var mongoose require mongoose var uriUtil require mongodb uri var mongodbUri mongodb localhost db name
  • 在 MongoDB 中按索引更新插入数组中子文档中的字段

    我有以下 MongoDB 结构 id other stuff my array title body email title body email title body email 我需要在 my array 字段内的子文档中更新 或插入
  • Mongo JSON 文档 -> JSON -> BSON

    我正在使用 Node js 构建一个使用 mongodb 的 Web 套接字服务器 我使用 node mongodb native 作为访问 mongodb 的库 当我对数据库中的对象调用 console log sys inspect i
  • 如何获取 bson 文档的大小(以字节为单位)

    bson文档的size 函数返回的int值是字节数吗 无法找到此 API 的详细信息 如何获取 bson 文档的大小 以字节为单位 这是我的代码 import org bson Document MongoDatabase db Mongo
  • Windows 7 机器上的 MongoDB:无法建立连接

    在 Windows 7 机器上使用 mongod exe 启动 Mongo 后 我尝试启动 mongo shell 但失败并出现以下错误 无法连接到 127 0 0 1 27017 原因 errno 10061 否 由于目标机器主动拒绝而无
  • Mongodb 通过查询和分组查找

    简单收集 id 123 name FooBar zone Bas id 456 name Alice zone Bas id 789 name FooBar zone Bas 首先 我构建一个查询来按名称查找所有元素 db collecti
  • Java MongoDB 获取子文档的值

    我试图从子文档中获取键的值 但我似乎无法弄清楚如何使用 BasicDBObject get 函数 因为键嵌入了两层深度 这是文档的结构 File name file 1 report name report 1 group RnD 基本上一
  • 修订:算法和数据结构

    我需要通过修订来构建和处理数据的想法 例如 我有一个对象数据库 例如汽车 每个对象都有许多属性 这些属性可以是任意的 因此没有一个固定的模式来描述这些对象 这些对象可能保存为键值对 现在我需要更改对象的属性 我不想完全重写它 我希望能够返回
  • 如何验证 ObjectID

    使用 Joi 模式验证 是否可以针对 MongoDB ObjectID 进行验证 像这样的事情可能很棒 id Joi ObjectId required error errorParser 我发现如果我这样做 Joi object id J
  • 如何使用 Stripe 在一次操作中创建客户和卡片?

    我正在尝试第一次初始化客户 我有一个表格 他们可以在那里注册和填写所有内容 然后他们提交 在客户端上 会发生以下情况 var cardValues AutoForm getFormValues credit card form insert
  • 使用 Spring Data MongoDB 查询纯 BSON

    是否可以在 Spring Data MongoDB 中查询纯 JSON BSON 数据 而无需将数据转换为实际的模型实现 我能找到的只是 MongoOperation 的
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档

随机推荐

  • 毕业设计-基于机器视觉的安全帽佩戴识别系统

    目录 前言 课题背景与意义 课题实现技术思路 目标检测 算法检测 算法实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的
  • Java之局部变量的作用域

    1 循环语句中变量 public static void main String args for int i 0 i lt 10 i int sum 3 System out println i sum 就上面最简单的程序说明吧 上面在f
  • 玻纤效应对skew的影响(三)

    玻纤效应对skew的影响 一 玻纤效应对skew的影响 二 对内skew对32Gbps NRZ和64Gbps PAM 4的影响 这一篇中 玻纤效应造成的对内skew将会加入到32Gbps NRZ和64Gbps PAM 4 SerDes全链路
  • 转载-浅析UDS诊断

    文章目录 前言 一 诊断和通信管理功能单元 0x10 DiagnosticSessionControl 0x11 ECUReset 0x27 SecurityAccess 0x28 CommunicationControl 0x3E Tes
  • maven工程编译生成source包

    开发Java服务端项目的时候 经常需要开发SDK作为依赖包提供给目标工程引用 但是目标工程在运行的调试的时候断点到依赖包里面的代码 由于依赖包的代码是编译后端class类 和源码有不少差异 不方便阅读 所以在开发的时候最好生成源码形式的依赖
  • Linux下Android Studio的安装步骤及关键点【整理】

    2013年google公司发布了一个新的Android集成开发环境 Android Studio 它为Android开发者提供了更多便利 而google慢慢地已经把重心放到Android Studio的开发上了 所以对于Android工程师
  • Allegro输出带等长规则的Excel操作指导

    Allegro输出带等长规则的Excel操作指导 Allegro可以输出带等长规则的Excel文件 方便检查和查阅 具体操作如下 打开规则管理器 选择Relative Propagation Delay 选择需要输出的match group
  • 如何清除SQL Server Management Studio的最近服务器列表

    SQL Server Management Studio SSMS 的 连接到服务器 对话框会记录用户所有访问过的服务器名称 这个功能对于经常连接多个数据库的人来说确实挺方便的 不过使用了一段时间之后 这个列表会变得很长 里面还有很多服务器
  • 利用原生js实现随机颜色画布

    这几天复习了一下js的DOM 文档对象模型 部分 看到鼠标事件的时候想到可以试着写一个js画布的案例 一 实现思路 1 利用js绑定鼠标按下事件 鼠标放开事件 在通过鼠标移动事件 获取鼠标所在位置 2 通过鼠标移动事件动态创建节点挂载到页面
  • 家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

    前言 其实这个专题很久很久之前就想写了 但是一直因为各种原因拖着没动笔 因为没有资格 也没有钱在一线城市买房 但是在要结婚之前 婚房又是刚需 我和太太最终一起在一线城市周边的某二线城市买了房 再之后 一起装修 她负责非电相关 我负责电 网相
  • 字符串与数组的相互转换

    一 数组转字符串 arr join 指定符号 用指定符号把数组元素连接起来 返回连接好的字符串 let arr 1 2 3 4 arr join 1 2 3 4 arr join 1 2 3 4 二 字符串转数组 多个元素 str spli
  • Android NDK开发-环境搭建(一)

    一 概念 Android NDK Android Native Development Kit 简称NDK Android NDK 是一组允许您将 C 或 C 原生代码 嵌入到 Android 应用中的工具 能够在 Android 应用中使
  • python多进程原理及其实现

    文章目录 1 进程的基本概念 2 父进程和子进程 2 1 父子进程如何区分 2 2 子进程如何回收 3 Python进程模块 3 1 fork 3 2 Process进程 3 3 进程池POOL 多个进程 4 进程间通信方式 5 多进程实现
  • SOLOv2 学习笔记

    博客原文 https blog csdn net weixin 44270815 article details 105283301 模型下载教程 https blog csdn net weixin 44270815 article de
  • Win64安装cx_Oracle过程

    学习python过程中 因需要连接oracle数据库 所以要安装cx Oracle 我的电脑是WIN64 python是2 7版本 本地oracle client是32位的 安装过cx Oracle 5 2 1 11g win amd64
  • js实现word转化为html

  • windows8.1 vs2015 dlib库cpu 版本编译以及应用 library is 90, caller expects 80

    近期由于要做一个关于人脸计数的项目 因此对dlib库进行了编译和使用 其中遇到了不少问题 下面请听我一一道来 第一步 从dlib官网下载dlib源码 链接地址 https github com davisking dlib 第二步 采用cm
  • PrimeTime中的DMSA

    第一次尝试使用PT的DMSA 步骤存在太多的弯弯绕绕了 这里记录一下 一 什么是DMSA 在PT中 我们将一种operating mode 如FUNC DFT等 和一种operating condition 如WC WCZ AVS等 的组合
  • SQLDEVELOPER启动警告 - 无法安装某些模块: oracle.jewt_core - org.netbeans.InvalidException: Netigso

    https bbs csdn net topics 390721236 page 1 SQL Developer第一次启动后没问题 但是第二次启动后就报错 根据如下步骤可以解决 1 Go to C Users USERNAME AppDat
  • C#操作MongoDB,看我这一篇就够了!

    一 准备工作 工欲善其事必先利其器 首先呢咱们得下载好C 程序里面可以驱动mongodb的组件 走起官网 C 操作mongodb组件下载 菜鸟教程也上一上 mongodb菜鸟教程 dll下载下来之后有这几个 都引用上 不要省 哈哈 个人还是