后端:C#操作Mongodb用法笔记

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。今天主要给大家介绍一下C#编程语言下Mongodb的用法。开发环境为VS2015示例主要包括数据的增删改查、分页查询、文件存储等功能。有需要的朋友可以一起学习一下。

1、需要引用Mongodb程序集

MongoDB.Bson.dll

MongoDB.Driver.dll

2、创建Mongodb工具类库 MongodbHelper.cs

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;namespace MongodbHelper
{/// <summary>/// MongoDB的基本增删改查/// </summary>public class MongodbTool{private readonly MongoDatabase _db;//数据库默认地址private readonly string host = ConfigurationManager.AppSettings["db_host"];//数据库默认名称private readonly string db_name = ConfigurationManager.AppSettings["db_name"];public MongodbTool(){var client = new MongoClient(host); //ip及端口var server = client.GetServer();_db = server.GetDatabase(db_name); //数据库名称}#region 通用增删改查/// <summary>/// 新增单个实体模型 modifiy by 2020-11-11/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <returns>True:成功,False:失败</returns>public bool Insert<T>(T entity){bool isOk = true;try{BsonDocument doc = entity.ToBsonDocument();WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Insert(doc);isOk = result.Ok;}catch (Exception ex){}return isOk;}/// <summary>/// 新增实体集合模型/// </summary>/// <typeparam name="T"></typeparam>/// <param name="entity"></param>/// <returns>True:成功,False:失败</returns>public bool Add<T>(IEnumerable<T> entity){bool isOk = true;try{int s = 1;IEnumerable<WriteConcernResult> results = this._db.GetCollection(typeof(T).Name).InsertBatch(entity);foreach (var item in results){if (item.Ok)isOk = true;elseisOk = false;}}catch (Exception ex){}return isOk;}/// <summary>/// 查询单条数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Field">查询属性字段</param>/// <param name="Value">字段值</param>/// <returns>返回当前实体</returns>public T FindOne<T>(string Field, string Value){T oneEntity = default(T);try{FindOneArgs args = new FindOneArgs{Query = Query.EQ(Field, Value)};oneEntity = this._db.GetCollection(typeof(T).Name).FindOneAs<T>(args);this._db.GetCollection(typeof(T).Name).FindAs<T>(Query.GTE(Field, Value)).ToList();}catch (Exception ex){}return oneEntity;}/// <summary>/// 查询多条数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Field">查询属性字段</param>/// <param name="Value">字段值</param>/// <returns>返回当前实体集合</returns>public List<T> FindMore<T>(string Field, string Value){List<T> list = new List<T>();try{list = this._db.GetCollection(typeof(T).Name).FindAs<T>(Query.GTE(Field, Value)).ToList();}catch (Exception ex){}return list;}/// <summary>/// 查询文档所有数据/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public List<T> FindAllMore<T>(){List<T> list = new List<T>();try{list = this._db.GetCollection(typeof(T).Name).FindAllAs<T>().ToList();}catch (Exception ex){}return list;}/// <summary>/// 分页查询文档/// </summary>/// <typeparam name="T"></typeparam>/// <param name="pageIndex">页次</param>/// <param name="pageRow">每页显示记录数</param>/// <param name="total">总记录数</param>/// <returns></returns>public List<T> FindMoreForPage<T>(int pageIndex, int pageRow, ref long total){List<T> list = new List<T>();try{total = this._db.GetCollection(typeof(T).Name).FindAllAs<T>().Count();    //获取总记录数if (pageIndex == 1){list = this._db.GetCollection(typeof(T).Name).FindAllAs<T>().SetLimit(pageRow).ToList();}else{var bd = this._db.GetCollection(typeof(T).Name).FindAll().SetSortOrder("_id:1").SetLimit((pageIndex - 1) * pageRow).Last();   //获取最后一个ID主键var el = bd.GetElement(0);var value = el.Value;list = this._db.GetCollection(typeof(T).Name).FindAs<T>(Query.GT("_id", value)).SetSortOrder("_id:1").SetLimit(pageRow).ToList();}}catch (Exception ex){}return list;}/// <summary>///  by 2020 ADD/// </summary>/// <typeparam name="T"></typeparam>/// <param name="query">查询条件</param>/// <param name="pageIndex">当前页</param>/// <param name="rows">行数</param>/// <param name="totalCount">总行数</param>/// <returns></returns>public List<T> FindPageNewAdd<T>(IMongoQuery query, int pageIndex, int rows, ref long totalCount){List<T> list = new List<T>();int skipCount = 0;try{if (pageIndex > 1){skipCount = (pageIndex - 1) * rows;}else{pageIndex = 1;}totalCount = this._db.GetCollection(typeof(T).Name).FindAs<T>(query).Count();if (totalCount > 0){list = this._db.GetCollection(typeof(T).Name).FindAs<T>(query).SetFlags(QueryFlags.NoCursorTimeout).SetSortOrder().SetSkip(skipCount).SetLimit(rows).ToList();}}catch (Exception){throw;}return list;}/// <summary>/// 按条件分页查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="query">查询条件</param>/// <param name="pageIndex">页次</param>/// <param name="pageRow">每页显示记录数</param>/// <param name="total">总记录数</param>/// <returns></returns>public List<T> FindMoreForPageByCondion<T>(IMongoQuery query, int pageIndex, int pageRow, ref long total){List<T> list = new List<T>();try{total = this._db.GetCollection(typeof(T).Name).FindAs<T>(query).Count();//获取总记录数if (pageIndex == 1){list = this._db.GetCollection(typeof(T).Name).FindAs<T>(query).SetSortOrder(SortBy.Descending("CreateDate")).SetLimit(pageRow).ToList();}else{var bd = this._db.GetCollection(typeof(T).Name).Find(query).SetSortOrder("_id:1").SetLimit((pageIndex - 1) * pageRow).Last();   //获取最后一个ID主键var el = bd.GetElement(0);var value = el.Value;list = this._db.GetCollection(typeof(T).Name).FindAs<T>(query).SetSortOrder("_id:1").SetSkip(pageRow).SetLimit(pageRow).ToList();}}catch (Exception ex){}return list;}/// <summary>/// 更新实体单个字段值/// </summary>/// <typeparam name="T"></typeparam>/// <param name="whereField">条件字段</param>/// <param name="whereValue">条件字段值</param>/// <param name="updateField">修改字段</param>/// <param name="updateValue">修改字段值</param>/// <returns></returns>public bool UpdateEntity<T>(string whereField, string whereValue, string updateField, string updateValue){bool isOk = true;try{var query = Query.EQ(whereField, whereValue);var update = Update.Set(updateField, updateValue);WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Update(query, update);if (!result.Ok)isOk = false;}catch (Exception ex){}return isOk;}/// <summary>/// 更新整个实体模型字段/// </summary>/// <typeparam name="T">泛型参数</typeparam>/// <param name="whereField">条件字段</param>/// <param name="whereValue">条件值</param>/// <param name="updateEntity">实体模型</param>/// <returns>True:成功,False:失败</returns>public bool UpdateEntityMoreFields<T>(string whereField, string whereValue, T updateEntity){bool isOk = true;try{var query = Query.EQ(whereField, whereValue);BsonDocument bsonDoc = updateEntity.ToBsonDocument(typeof(T));var update = new UpdateDocument{{"$set",bsonDoc}};WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Update(query, update);if (!result.Ok)isOk = false;}catch (Exception ex){}return isOk;}/// <summary>/// 删除实体文档/// </summary>/// <typeparam name="T">泛型参数</typeparam>/// <param name="whereField">条件字段</param>/// <param name="whereValue">条件值</param>/// <returns></returns>public bool DelEntity<T>(string whereField, string whereValue){bool isOk = true;try{var query = Query.EQ(whereField, whereValue);WriteConcernResult result = this._db.GetCollection(typeof(T).Name).Remove(query);if (!result.Ok)isOk = false;}catch (Exception ex){}return isOk;}#endregion#region GridFS 文件操作/// <summary>////// </summary>/// <returns></returns>public MongoCursor<MongoGridFSFileInfo> FindAll(){return this._db.GetGridFS(MongoGridFSSettings.Defaults).FindAll();}/// <summary>////// </summary>/// <param name="filePath"></param>public void UploadFile(string filePath){FileInfo fi = new FileInfo(filePath);this._db.GetGridFS(MongoGridFSSettings.Defaults).Upload(filePath, fi.Name);}/// <summary>////// </summary>/// <param name="filePath"></param>/// <param name="fileName"></param>public void UploadFile(string filePath, string fileName){this._db.GetGridFS(MongoGridFSSettings.Defaults).Upload(filePath, fileName);}/// <summary>///下载文件保存到默认目录/// </summary>/// <param name="fileName"></param>/// <param name="filePath"></param>public void DownloadFile(string fileName){this._db.GetGridFS(MongoGridFSSettings.Defaults).Download(fileName);}/// <summary>///下载文件保存到其他目录/// </summary>/// <param name="fileName"></param>/// <param name="filePath"></param>public void DownloadFileOther(string localFileName, string remoteFileName){this._db.GetGridFS(MongoGridFSSettings.Defaults).Download(localFileName,remoteFileName);}/// <summary>////// </summary>/// <param name="fileName"></param>public void DeleteFile(string fileName){this._db.GetGridFS(MongoGridFSSettings.Defaults).Delete(fileName);}/// <summary>////// </summary>public void DeleteAll(){foreach (var inst in this._db.GetGridFS(MongoGridFSSettings.Defaults).FindAll()){inst.Delete();}} #endregion}
}

3、创建实体 User.cs

using MongoDB.Bson;
namespace MongoHelper.Model
{public class User{public ObjectId _id;public string name { get; set; }public int age { get; set; }}
}

4、调用示例代码

 
var list = new List<User>();for (int i = 0; i < 100; i++){User user = new User();user.age = 20 + i;user.name = "测试" + i;list.Add(user);}//新增实体//tool.Add(list);//更新实体//tool.UpdateEntity<User>("name", "测试", "age", "99");//删除操作//tool.DelEntity<User>("name","测试");long total = 0;//构造查询条件IMongoQuery query = Query.And(Query.Matches("name", "1"));//分页查询数据var ll = tool.FindMoreForPageByCondion<User>(query, 0, 10, ref total);// 文件操作var model = tool.FindAllMore<User>();string folder = @"E:\photo";DirectoryInfo di = new DirectoryInfo(folder);//循环读取文件上传foreach (var file in di.GetFiles()){tool.UploadFile(file.FullName, file.Name);}var fileModel = tool.FindAll().First();// 保存文件指定目录tool.DownloadFileOther("D:\\"+fileModel.Name, fileModel.Name);//下载文件到当前目录pictureBox1.ImageLocation = "D:\\"+fileModel.Name;

具体的代码地址:https://gitee.com/hgm1989/mongodb-demo

如有问题可以随时沟通交流。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机语言分为三种:机器语言、汇编语言和高级语言

计算机语言有哪几种&#xff1f; 计算机语言分为三种&#xff1a;机器语言、汇编语言和高级语言 1.机器语言 机器语言是用二进制代码表示计算机能直接识别和执行的一种机器指令的集合&#xff0c;它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。 优点&#…

asp php java_ASP\JSP\PHP相比各有什么优缺点?

展开全部ASP、JSP、和PHP的优点e5a48de588b662616964757a686964616f31333366306538和缺点&#xff1a;一、ASP优点:1、无需编译2、易于生成3、独立于浏览器4、面向对象5、与任何ActiveX scripting 语言兼容6、源程序码不会外漏缺点:1、Windows本身的所有问题都会一成不变的也累…

js变量提升_学习笔记:JS中的作用域和预解析

知识总结&#xff1a;谢静贤、汤昊在javascript中作用域是非常重要的&#xff0c;本文将会说明作用域以及我们在工作&#xff0c;以及面试中的一些面试题&#xff0c;如果有不足的地方希望大家可以评论指出来&#xff0c;自己一定会及时的改正错误&#xff0c;避免大家走入一些…

ArcGIS Engine开发之旅09--几何对象和空间参考

1.Geometry Geometry 是 GIS 中使用最为广泛的对象集之一&#xff0c;用户在创建、删除、编辑和进行地理分析的时候&#xff0c;就是处理一个包含几何形体的矢量对象&#xff1b;除了显示要素意外&#xff0c;控件对象选择&#xff0c;要素符号化&#xff0c;标注要素&#xf…

项目管理:软件工程相关知识笔记

1、软件工程概念介绍软件工程是指应用计算机科学、数学、管理科学等原理&#xff0c;以工程化的原则和方法来解决软件问题的工程&#xff0c;其主要目的是提高软件生产率、提高软件质量、降低软件成本。2、软件工程学的组成软件开发技术&#xff1a;软件开发方法学、软件工具、…

android开发java环境_搭建Android开发环境 - Android - mobile - JavaEye论坛

Android的开发现在是如火如荼&#xff0c;逞现在不是很忙了&#xff0c;学习了下&#xff0c;这里记录下了在windows在如何搭建Android开发环境&#xff0c;对自己是个记录&#xff0c;对新入门的兄弟姐妹们可以参考一下&#xff01;(1)安装JDK&#xff0c;省略。(2)下载Androi…

updatebyprimarykeyselective的where条件是全部字段_ArcGIS 字段计算器

使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下&#xff0c;为了设置字段值&#xff0c;可能要对单条记录甚至是所有记录执行数学计算。您可以对所有记录或选中记录执行简单计算和高级计算。此外&#xff0c;还可以在属性表中的字段上计算面积、长度、周长和其他几何…

项目管理基础:软件生命周期概念介绍

1、软件生命周期定义软件产品或软件系统要经历孕育、诞生、成长、成熟、衰亡等阶段称为软件的生命周期。2、软件生命周期阶段组成软件的生命周期由可行性分析与项目开发计划、需求分析、总体设计、详细设计、编码、单元测试、综合测试、维护阶段。2.1 可行性分析与项目开发计划…

jvm栈和寄存器

jvm栈和寄存器 总结

项目管理基础:项目的生存周期模型

1、概念介绍软件生命周期模型是一个包含软件产品开发、运行和维护中有关过程、活动和任务的框架&#xff0c;它覆盖了系统从需求定义到系统使用的结束阶段。特点&#xff1a;描述了开发的主要阶段定义了每个阶段需要完成的任务和过程规范了每个阶段的输入输出提供了一个标准框架…

jps显示当前所有java进程pid

很多Java命令都在jdk的JAVA_HOME/bin/目录下面&#xff0c;jps也不例外&#xff0c;他就在bin目录下&#xff0c;所以&#xff0c;他是java自带的一个命令。 jps(Java Virtual Machine Process Status Tool) 是java提供的一个显示当前所有java进程pid的命令&#xff0c;适合在…

jvm内存结构_浅谈JVM内存结构

JVM 可以分为 5 个部分&#xff0c;分别是&#xff1a;类加载器&#xff08;Class Loader&#xff09;&#xff1a;加载字节码文件到内存。运行时数据区&#xff08;Runtime Data Area&#xff09;&#xff1a;JVM 核心内存空间结构模型。执行引擎&#xff08;Execution Engine…

鸿蒙和安卓,到底有什么区别?

对于开发者来说两个最关键的点值得关注&#xff1a;一个是 Beta 版的开发工具&#xff0c;一个是开源网站。开源网站在开发者大会上宣布将 HarmonyOS源代码捐赠给中国开放原子开源基金会&#xff0c;并在大会上公布了鸿蒙系统的开源路线。OpenHarmony 官方源码地址&#xff1a;…

错题集03

(选择一项) 3A: B: C: D: 正确答案是 B解析:LinkedList是实现List,Collection接口,是链表方式进行构建的,根据开发要求不同,可以使用LinkedList实现栈(先进先出)和堆(先进后出)这样的数据结构。(选择一项) 4A: B: C: D: 正确答案是 C解析&#xff1a;由于Hashtable是线程…

项目管理基础:软件开发的方法介绍

软件开发方法主要有结构化方法、原型化方法、面向对象开发方法、敏捷方法。1、结构化方法结构化方法由结构化分析、结构化设计、结构化程序设计组成&#xff0c;它是一种面向数据流的开发方法。结构化分析&#xff1a;依据分解与抽象的原则&#xff0c;按照系统中数据处理的流程…

类加载器子系统的作用

类加载器子系统的作用

Magento Block设计分析(深入分析)

Magento中Block是一个很重要的组件&#xff0c;它在Block中充当非常重要的角色&#xff0c;下面我们来分析一下Magento中Block是怎样设计的&#xff0c;我们应该怎样使用这个重要的角色。1、Magento Block类图: 图1: 继承Varien_Object的对象都有一个_data类变量&#xff0c;用…

JAVA输出x和y和z_JAVA实例:输入三个整数x,y,z,请把这三个数由小到大输出-吾爱编程网...

今天为大家分享一个java经典实例输入三个整数x,y,z,请把这三个数由小到大输出&#xff0c;相信很多初学者都会学到这道题目&#xff0c;接下来吾爱编程为大家介绍一下程序的相关写法&#xff0c;有需要的小伙伴可以参考一下:1、题目&#xff1a;输入三个整数x,y,z&#xff0c;请…

软件项目管理相关概念介绍笔记

1、成本估算由于软件项目具有可见性差、难定量化的特点&#xff0c;一般情况下很难在项目完成前准确的评估软件项目开发的工作量和费用。通常会根据以往开发类似项目的经验来进行成本估算。也可以将整个项目划分为若干个子系统或按照软件的生命周期的各个阶段分别进行费用估算&…