MongoDB 基礎教程CURD幫助類

来源:http://www.cnblogs.com/weiBlog/archive/2017/01/19/6307021.html
-Advertisement-
Play Games

最近兩天在學習MongoDB,強大的文檔資料庫。給我最大的感覺就是相比於SQL或者MSQ等傳統的關係型資料庫,在使用和配置上真的是簡化了很多。無論是在集群的配置還是故障轉移方面,都省去了許多繁瑣的步驟,但最重要是的什麼呢?是效率,它的出現解決了傳統關係型資料庫的IO瓶頸,極大的提高了工作效率,適合海 ...


      最近兩天在學習MongoDB,強大的文檔資料庫。給我最大的感覺就是相比於SQL或者MSQ等傳統的關係型資料庫,在使用和配置上真的是簡化了很多。無論是在集群的配置還是故障轉移方面,都省去了許多繁瑣的步驟,但最重要是的什麼呢?是效率,它的出現解決了傳統關係型資料庫的IO瓶頸,極大的提高了工作效率,適合海量數據的查詢。

      當然,這些老生常談的話可能你已經聽了很多,耳朵都磨出了繭子,廢話少說,整點乾貨。

      博客園裡關於MongoDB的文章搜一下會出來很多,但是大多都是關於如果安裝或者複製集、故障轉移等,對於已經學會安裝但是希望使用的同學會覺得無從下手,博主感同身受,所以在這裡分享一下在.NET中如何使用MongoDB來進行基本的CURD,同時自己寫了一個基本的通用幫助類,如果覺得有需要的同學可以拿去使用,覺得有用的可以給個贊,真的,給贊比給錢讓我更加歡樂!!!

 

1.兩種常用的操作介質

      在.NET中對MongoDB常用的操作介質有兩種,分別是BsonDocument對象模型以及自定義的實體類型。

(1)BsonDocument

      MongoDB是文檔型資料庫,在MongoDB的Collection中,每個文檔可以看做是一個Bson(Binary Json)對象,所以在驅動中有一個BsonDocument類型,它的本質name/value的鍵值對集合,可以通過下麵方式生成一個BsonDocument的文檔,並通過Add方法添加鍵值對,通過這種方式生成的BsonDocumen對象可以直接插入Collection。

BsonDocument student1 = new BsonDocument();
student1.Add("sid", 10);
student1.Add("name", "Will10");
student1.Add("gender", "Male");
student1.Add("age", 26);

(2)自定義實體類型

關於自定義實體類型可能我們每天都在使用,沒有什麼需要將的,只有一點,如果你想通過自定義的實體類型操作MongoDB中的數據集合,那麼你的實體中的欄位名要與MongoDB中的欄位名保持一致(如_id與ID這樣就不一致,則會報錯),而且還需要有_id欄位。

 

上面兩種方式都可以使用,而且各有好處,通過自定義類型的方式,可以使得collection中的文檔有比較統一的模式;使用BsonDocument方式則可以支持更多的文檔模式,也就是說如果一個collection中的文檔擁有各種各樣的模式,那麼BsonDocument方式就會更靈活。

 

2.連接資料庫

供.NET使用的的MongoDB驅動不止一個,官方也有推薦的驅動,這裡博主選用的是官方推薦的驅動mongocsharpdriver,可以通過NuGet下載安裝。

資料庫的連接代碼如下:

public static void GetColloection(string IP, string Port, string Database, string CollectionName)
{
     string connection = string.Format("mongodb://{0}:{1}", Database, Port);
     MongoClient client = new MongoClient(connection)
     var server = client.GetServer();
     collection = server.GetDatabase(Database).GetCollection(CollectionName);
} 

這裡博主自己封裝了一個連接方法,這個連接方法並不好,不夠靈活,切換數據集合的時候還要重新輸入一遍IP和Port,大家可以自己封裝適合自己使用的。

 

3.查詢

(1)查詢集合中所有的數據,並返回List集合:

public static List<T> GetList<T>()
{
     return collection.FindAllAs<T>().ToList();
}

 

(2)根據Id查詢集合中對應的數據,返回數據實體:(你的VS中需要有對應的實體model)

public static T GetById<T>(int Id)
{
     var query = Query.EQ("_id", Id);
     return collection.FindOneAs<T>(query);
}

這裡使用了Query Builder的查詢方式,相比QueryDocument(這裡沒有使用)這是一種更簡潔的查詢方式,EQ的意思表示“==”,其它還有GT(>)等。當通過這種方式查詢的時候,我們需要使用driver中的builder來生成query。所以,要引用下麵using語句:

using MongoDB.Driver.Builders;

通過下麵的語句,可以查詢年齡大於20的學生:

 var query = Query.GT("age", 20);
 foreach (var student in collection.Find(query))
 {
     Console.WriteLine(student);
 }

(3)根據欄位查詢對應的數據實體

很多時候我們會根據Id查詢數據,但是有些情況下我們可能會用到其它的數據來查詢,這裡封裝了一個方法:

public static List<T> GetValueByKey<T>(string key, string value)
{
    var query = Query.EQ(key, value);
    return collection.FindAs<T>(query).ToList();
}

(4)Linq查詢

在driver的1.8 release之後,官方驅動就可以支持LINQ操作了。我們只需要通過下麵的using語句,就可以支持LINQ的方式進行查詢了。

using MongoDB.Driver.Linq;

所以,可以查詢年齡大於20的學生,也可以通過下麵方式實現:

var linquery = from e in collection.AsQueryable<Student>()
             where e.age > 20
             select e;

var linquery1 = collection.AsQueryable<Student>().Where(e => e.age > 20);

 

4.新增

(1)常用的有Insert方法,它有5個重載,可以根據實際情況選取使用,這裡使用它的泛型方法Insert<T>(T document):

public static void Insert<T>(T model)
{
       try
       {
            collection.Insert(model);
        }
        catch (Exception ex)
        {
             throw new Exception(ex.Message);
        }
}

 

(2)新增實體集合

public static void Insert<T>(List<T> list)
{
       try
       {
            foreach (var model in list)
            {
                  collection.Insert(model);
            }
                
       }
       catch (Exception ex)
       {
           throw new Exception(ex.Message);
       }
}

 

5.修改

修改的方式有兩種,分別是Save和Update,這裡沒有進行方法封裝,給出示例。

(1)Save

static void Save(MongoCollection collection)
{
       var query = Query.EQ("_id", 9);
       var model = collection.FindOneAs<goods>(query);
       if (model != null)
       {
             model.title = "修改測試";
             collection.Save(model);
       }
}

 

(2)Update

static void Update(MongoCollection collection)
{
     var query = Query.EQ("_id", 8);
     var update = Update<goods>.Set(x=>x.title, "Update修改測試");
     collection.Update(query, update);
}

 

6.刪除

刪除就比較簡單了,給出示例和封裝的方法:

(1)示例

static void Remove(MongoCollection collection)
{
     var query = Query.EQ("_id", 11);
     collection.Remove(query);
}

(2)封裝的方法

public static void Remove(IMongoQuery query)
{
       try
       {
           collection.Remove(query);
       }
       catch (Exception ex)
      {
           throw new Exception(ex.Message);
      }
} 

 

      好了,基本CURD到這裡就完成了,希望前面講的東西能夠幫助到你,說實話,MongoDB真的很強大,但是呢,剛開始學習肯定會有一個懵逼的過程,博主現在還處於懵逼的過程,一邊分享一邊幫自己梳理。下一篇MongoDB會寫一下複製集以及分片,但不會寫怎麼操作,畢竟園子里一搜一大把(主要是博主自己學的也不咋樣),會寫一下在使用的過程中的出錯點以及其中的原理,比如Master宕掉以後是如何從Slave中選舉出一個新的Master以及Slave的種類和作用。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 網上對TempData的總結為: 保存在session中,Controller每次執行請求時,會從session中一次獲取所有tempdata數據,保存在單獨的內部數據字典中,而後從session中清空tempdata。然後通過key從字典中獲取指定的Tempdata,每訪問一次後對應的Key就會從 ...
  • 比AutoMapper輕量快速簡潔的實體映射庫YeaJur.Mapper ...
  • 在上一篇文章中,我們已經瞭解到瞭如何在SuperSocket處理客戶端請求。 同時我們可能會發現一個問題,如果我們的伺服器端包含有很多複雜的業務邏輯,這樣的switch/case代碼將會很長而且非常難看,並且沒有遵循面向對象設計的原則(OOD)。 在這種情況下,SuperSocket提供了一些讓我們 ...
  • 更新內容:宿主的唯一編號和名稱可以輸入符號"."日誌文本框增加滾動條,並且總是顯示文本末端增加啟動方式選擇:1.手動啟動 2.跟隨系統啟動 最新下載地址: http://pan.baidu.com/s/1dEAs3Vr 密碼:8d9t 使用說明: http://www.cnblogs.com/Myt ...
  • 採用單位矩陣行列式變換求逆矩陣,源碼展示: public static double[,] Inverse(double [,] Array) { int m = 0; int n = 0; m = Array.GetLength(0); n = Array.GetLength(1);... ...
  • 前言 上一篇介紹了擴展類庫的功能簡介,通過json文件配置sql語句 和 sql語句的直接執行,這篇開始說明sql配置的策略模塊:策略管理器與各種策略的配置。 類庫源碼:github:https://github.com/skigs/EFCoreExtend 引用類庫:nuget:https://w ...
  • 閱讀博客http://jonskeet.uk/csharp/memory.html的筆記(個人水平有限,如若翻譯、記錄有誤,請提,謝謝~) 誤區:引用類型保持在堆中,值類型保持在棧中。 問題:前半句正確,後半句“值類型保持在棧中”不正確。 值類型的存儲位置: 1.局部變數都存於棧中,另外引用類型的變 ...
  • 聯繫QQ:250742613 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...