MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用
MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
什么場景下使用MongoDB
MongoDB雖然是NoSQL(非關系型的數據庫),但是實際使用的時候可以當做關系型數據庫來用,
mysql等數據庫中單表數據量大了之后,想要擴展字段就非常痛苦,應為要卡很長時間,這時候就必須面臨著兩種選擇 要么水平切分數據庫,要么使用nosql來存儲海量數據,mongodb作為日志存儲是非常利于擴展的,還有數據分析等都可以用mongodb作為靈活的數據源的存儲方式。
MongoDB 概念解析
在mongodb中基本的概念是文檔、集合、數據庫,下面我們挨個介紹。
| database | database | 數據庫 |
| table | collection | 數據庫表/集合 |
| row | document | 數據記錄行/文檔 |
| column | field | 數據字段/域 |
| index | index | 索引 |
| table joins | 表連接,MongoDB不支持 | |
| primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
數據庫
一個mongodb中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
"show dbs" 命令可以顯示所有數據的列表。
集合
集合就是 MongoDB 文檔組,類似于 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表格。
集合存在于數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
比如,我們可以將以下不同數據結構的文檔插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.runoob.com","name":"菜鳥教程","num":5}
當第一個文檔插入時,集合就會被創建。
合法的集合名
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
集合名不能以"system."開頭,這是為系統集合保留的前綴。
用戶創建的集合名字不能含有保留字符。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。除非你要訪問這種系統創建的集合,否則千萬不要在名字里出現$。
文檔(Document)
文檔是一組鍵值(key-value)對(即 BSON)。MongoDB 的文檔不需要設置相同的字段,并且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。
下表列出了 RDBMS 與 MongoDB 對應的術語:
| 數據庫 | 數據庫 |
| 表格 | 集合 |
| 行 | 文檔 |
| 列 | 字段 |
| 表聯合 | 嵌入文檔 |
| 主鍵 | 主鍵 (MongoDB 提供了 key 為 _id ) |
需要注意的是:
文檔中的鍵/值對是有序的。
文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
MongoDB區分類型和大小寫。
MongoDB的文檔不能有重復的鍵。
文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
文檔鍵命名規范:
鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
.和$有特別的意義,只有在特定環境下才能使用。
以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
MongoDB 數據類型
下表為MongoDB中常用的幾種數據類型。
| String | 字符串。存儲數據常用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。 |
| Integer | 整型數值。用于存儲數值。根據你所采用的服務器,可分為 32 位或 64 位。 |
| Boolean | 布爾值。用于存儲布爾值(真/假)。 |
| Double | 雙精度浮點值。用于存儲浮點值。 |
| Min/Max keys | 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
| Array | 用于將數組或列表或多個值存儲為一個鍵。 |
| Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
| Object | 用于內嵌文檔。 |
| Null | 用于創建空值。 |
| Symbol | 符號。該數據類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號類型的語言。 |
| Date | 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息。 |
| Object ID | 對象 ID。用于創建文檔的 ID。 |
| Binary Data | 二進制數據。用于存儲二進制數據。 |
| Code | 代碼類型。用于在文檔中存儲 JavaScript 代碼。 |
| Regular expression | 正則表達式類型。用于存儲正則表達式。 |
ObjectId
ObjectId 類似唯一主鍵,可以很快的去生成和排序,包含 12 bytes,含義是:
- 前 4 個字節表示創建?unix?時間戳,格林尼治時間?UTC?時間,比北京時間晚了 8 個小時
- 接下來的 3 個字節是機器標識碼
- 緊接的兩個字節由進程 id 組成 PID
- 最后三個字節是隨機數
MongoDB 中存儲的文檔必須有一個 _id 鍵。這個鍵的值可以是任何類型的,默認是個 ObjectId 對象
mongodb windows安裝
下載地址 https://www.mongodb.com/download-center/community
客戶端工具
使用以下三種都可以
https://robomongo.org/download【推薦】
https://www.mongodb.com/download-center/compass【官方的,windows下會默認安裝】
https://nosqlbooster.com/downloads
如何使用
引入 nuget包 MongoDB.Driver
客戶端:
以下是常用的CRUD測試用例
using Microsoft.VisualStudio.TestTools.UnitTesting; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Driver; using MongoDB.Driver.Linq; using System; using System.Collections; using System.Collections.Generic; using System.Linq;namespace MongoDBDemo {/// <summary>/// mongodb先創建庫 test/// 再創建表 testlist/// </summary>[TestClass]public class UnitTest1{private MongoClient client;private IMongoDatabase database;public UnitTest1(){this.client = new MongoClient(new MongoClientSettings { Server = new MongoServerAddress("127.0.0.1", 27017), });this.database = client.GetDatabase("test");}/// <summary>/// 查所有記錄/// </summary>[TestMethod]public void TestQueryAll(){var list = database.GetCollection<A>("testlist");var result = list.Find("{}").ToList();}/// <summary>/// 基礎的查詢方式/// </summary>[TestMethod]public void TestQueryBase(){var collection = database.GetCollection<BsonDocument>("testlist");BsonDocument filter = new BsonDocument();var s = collection.Find(filter).ToList();using (var cursor = collection.FindAsync(filter).Result){while (cursor.MoveNextAsync().Result){var batch = cursor.Current;foreach (BsonDocument document in batch){Console.WriteLine(document.ToJson());}}}}/// <summary>/// 組裝查詢語句方式/// </summary>[TestMethod]public void TestQueryBuilders(){var list = database.GetCollection<A>("testlist");var filter = Builders<A>.Filter.Eq(x => x.Name, "b");var result = list.Find(filter).ToList();}/// <summary>/// linq asqueryable方式/// </summary>[TestMethod]public void TestQueryLinq(){var list = database.GetCollection<A>("testlist");var result = list.AsQueryable().Where(p => p.Name == "b").ToList();}[TestMethod]public void TestQueryLinq2(){var list = database.GetCollection<A>("testlist");var result = list.Find(p => p.Name == "b").ToList();}[TestMethod]public void TestInsert(){var list = database.GetCollection<A>("testlist");list.InsertOne(new A { Name = "a", Count = 1 });}[TestMethod]public void TestUpdate(){var list = database.GetCollection<A>("testlist");var update = Builders<A>.Update;list.UpdateOne(p => p.Name == "a", update.Set("Count", 2));}[TestMethod]public void TestDelete(){var list = database.GetCollection<A>("testlist");list.DeleteOne(p => p.Name == "s");}}//如果不加這個[BsonIgnoreExtraElements]會報錯 // System.FormatException:“Element '_id' does not match any field or property of class,// 也可以加屬性 public ObjectId _id { get; set; } 來解決[BsonIgnoreExtraElements]public class A{//public ObjectId _id { get; set; }public string Name { get; set; }public int Count { get; set; }} }更詳細的關于CRUD操作可以看官方文檔
轉載于:https://www.cnblogs.com/sands/p/11528819.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx反向代理结合apache和ph
- 下一篇: 一次搞懂建模语言UML