1. 程式人生 > >MongoDB入門及 c# .netcore客戶端MongoDB.Driver2.9.1使用

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目錄中。

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 對應的術語:

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操作可以看官方文