后端: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.pswp.cn/news/271205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271205.shtml
英文地址,請注明出處:http://en.pswp.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;還可以在屬性表中的字段上計算面積、長度、周長和其他幾何…

jQuery自定義選擇器

jQuery 1.8版本后&#xff0c; 可以通過$ 的createPseudo()方法自定義選擇器&#xff0c;滿足不同的需求&#xff0c;本文來自<jquery in action> <ul class"levels"><li data-level"1" data-points"1" data-technologies"j…

項目管理基礎:軟件生命周期概念介紹

1、軟件生命周期定義軟件產品或軟件系統要經歷孕育、誕生、成長、成熟、衰亡等階段稱為軟件的生命周期。2、軟件生命周期階段組成軟件的生命周期由可行性分析與項目開發計劃、需求分析、總體設計、詳細設計、編碼、單元測試、綜合測試、維護階段。2.1 可行性分析與項目開發計劃…

jvm棧和寄存器

jvm棧和寄存器 總結

python模型_python 模型的釋義

CharField#字符串字段, 用于較短的字符串.#CharField 要求必須有一個參數 maxlength, 用于從數據庫層和Django校驗層限制該字段所允許的最大字符數.IntegerField用于保存一個整數.FloatField# 一個浮點數. 必須 提供兩個參數:## 參數 描述# max_digits 總位數(不包括小數點和符…

java 布爾表達式_java - 布爾值,條件運算符和自動裝箱

java - 布爾值&#xff0c;條件運算符和自動裝箱為什么拋出falsepublic static void main(String[] args) throws Exception {Boolean b true ? returnsNull() : false; // NPE on this line.System.out.println(b);}public static Boolean returnsNull() {return null;}雖然…

安裝你自己的perl modules

來源&#xff1a; http://www.cnblogs.com/itech/archive/2012/12/17/2822044.html 安裝你自己的perl modules。當沒有root權限的時候&#xff0c;需要安裝perl modules到自己的home目錄下。 來自&#xff1a;http://servers.digitaldaze.com/extensions/perl/modules.html Ins…

項目管理基礎:項目的生存周期模型

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…

java annotation應用_java Annotation的應用

一、Annotation 示例Override Annotation1 Override2 public void onCreate(Bundle savedInstanceState);二、Annotation 概念及作用1 概念An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and package…

鴻蒙和安卓,到底有什么區別?

對于開發者來說兩個最關鍵的點值得關注&#xff1a;一個是 Beta 版的開發工具&#xff0c;一個是開源網站。開源網站在開發者大會上宣布將 HarmonyOS源代碼捐贈給中國開放原子開源基金會&#xff0c;并在大會上公布了鴻蒙系統的開源路線。OpenHarmony 官方源碼地址&#xff1a;…

錯題集03

(選擇一項) 3A: B: C: D: 正確答案是 B解析:LinkedList是實現List,Collection接口,是鏈表方式進行構建的,根據開發要求不同,可以使用LinkedList實現棧(先進先出)和堆(先進后出)這樣的數據結構。(選擇一項) 4A: B: C: D: 正確答案是 C解析&#xff1a;由于Hashtable是線程…