MongoDB入門及 c# .netcore客戶端MongoDB.Driver2.9.1使用
MongoDB 是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。
MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
什麼場景下使用MongoDB
MongoDB雖然是NoSQL(非關係型的資料庫),但是實際使用的時候可以當做關係型資料庫來用,
mysql等資料庫中單表資料量大了之後,想要擴充套件欄位就非常痛苦,應為要卡很長時間,這時候就必須面臨著兩種選擇 要麼水平切分資料庫,要麼使用nosql來儲存海量資料,mongodb作為日誌儲存是非常利於擴充套件的,還有資料分析等都可以用mongodb作為靈活的資料來源的儲存方式。
MongoDB 概念解析
在mongodb中基本的概念是文件、集合、資料庫,下面我們挨個介紹。
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 資料庫表/集合 |
row | document | 資料記錄行/文件 |
column | field | 資料欄位/域 |
index | index | 索引 |
table joins | 表連線,MongoDB不支援 | |
primary key | primary key | 主鍵,MongoDB自動將_id欄位設定為主鍵 |
資料庫
一個mongodb中可以建立多個數據庫。
MongoDB的預設資料庫為"db",該資料庫儲存在data目錄中。
"show dbs" 命令可以顯示所有資料的列表。
集合
集合就是 MongoDB 文件組,類似於 RDBMS (關係資料庫管理系統:Relational Database Management System)中的表格。
集合存在於資料庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和型別的資料,但通常情況下我們插入集合的資料都會有一定的關聯性。
比如,我們可以將以下不同資料結構的文件插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.runoob.com","name":"菜鳥教程","num":5}
當第一個文件插入時,集合就會被建立。
合法的集合名
集合名不能是空字串""。
集合名不能含有\0字元(空字元),這個字元表示集合名的結尾。
集合名不能以"system."開頭,這是為系統集合保留的字首。
使用者建立的集合名字不能含有保留字元。有些驅動程式的確支援在集合名裡面包含,這是因為某些系統生成的集合中包含該字元。除非你要訪問這種系統建立的集合,否則千萬不要在名字裡出現$。
文件(Document)
文件是一組鍵值(key-value)對(即 BSON)。MongoDB 的文件不需要設定相同的欄位,並且相同的欄位不需要相同的資料型別,這與關係型資料庫有很大的區別,也是 MongoDB 非常突出的特點。
下表列出了 RDBMS 與 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操作可以看官方文