[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

mongodb概要 [關于MongoDB] 官方網站: MongoDB屬于比較典型的NoSql數據庫。和Relationship數據庫相比,其數據屬于文檔結構。 最新版本的MongoDB為2.2.2 不支持WindowsXP [C#官方驅動程序] GitHub:https://github.com/mongodb/mongo-csharp-driver [管理工

mongodb概要

[關于MongoDB]

??? 官方網站:

? ? MongoDB屬于比較典型的NoSql數據庫。和Relationship數據庫相比,其數據屬于文檔結構。

??? 最新版本的MongoDB為2.2.2?? 不支持WindowsXP

[C#官方驅動程序]

???? GitHub:https://github.com/mongodb/mongo-csharp-driver

[管理工具]

???? 這里選用本人自制的可視化管理工具作為教程的演示工具。

???? 大聲呼吁:有興趣的同志,加入這個工具的開發

???? 下載地址:

???? GitHub:?? https://github.com/magicdict/MagicMongoDBTool

[建立第一個空數據庫]

????? 關于MongoDB的安裝,香港服務器,已經有很多文章介紹了。

????? 這里推薦CNBLOGS網友 百靈 的Mongodb之(初識如故)

????? 安裝這篇文章,應該可以正確安裝MongoDB,其實就是下載和解壓,完全綠色軟件。

????? 這個系列的教程,我將MongoDB解壓到:C:runmongo,可執行文件則都在C:runmongobin下面。

????? 新建一個MongoDB實例的方法很多,這里我新建了一個BAT文件,在BAT文件里面寫了3句命令:

????? 第一句:將執行目錄切換到Mongo可執行目錄

????? 第二句:新建一個目錄,MongoDB實例需要一個存放文件的目錄,這里我選擇新建一個C:mongodbmagicdict 目錄

????? 第三句,則是新建一個MongoDB實例,同時,將MongoDB實例的偵聽端口設置為 28030

???? 關于MongoDB的啟動參數,推薦 咫尺天涯的文章:mongodb啟動參數

?

1 cd C:runmongobin 2 mkdir C:mongodbmagicdict 3 mongod –port 28030 –dbpath C:mongodbmagicdict –rest

?

如果成功的話,將會有一個黑色的DOS控制臺出現。當然,這個控制臺只是日志輸出,無法操作。你也可以將日志存放到一個文件里面。

?

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

這個時候去查看? C:mongodbmagicdict,系統自動添加了一個 mongod.lock? 鎖文件。

接下來,啟動可視化工具,看看數據庫吧。

第一次啟動時候,選擇語言:

由于某些功能需要使用mongo的可執行文件,在可執行文件里面選擇可執行文件路徑

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

?下面是連接管理界面,里面列出了所有現存的連接

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

?單擊添加按鈕

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

? ??? ??? 由于是最簡單的數據庫,我們只需要填寫 連接名稱,主機,端口號即可。

????????? 連接名稱:這個可以使任意字符,是便于用戶記憶的。

????????? 主機:這里填寫服務器的IP地址,這里使用 localhost 表示本機

?????????? 端口:28030

這里你可以先使用 [測試] 按鈕,檢驗一下設置是否正確。如果沒有問題,則可以[添加]連接。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

選中剛才建立的連接,按下[確定]按鈕。則進入主界面。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

界面左邊的是當前連接(MongoDB實例)中所包含的數據庫對象。當然,這個連接里面只是單純的數據庫。除了有一個系統自動生成的local數據庫以外,什么都沒有。

界面右邊的是當前連接的狀態信息。 關于這些狀態信息,你可以參看官方的幫助文檔:

?一般來說,我們不會在local系統目錄里面添加數據,一般都會新建一個數據庫來保存用戶數據。

當然,你可以 選中Connection節點,然后用主菜單或者右鍵菜單來 [新建數據庫]。不過,這里將演示如何使用C#來創建數據庫,添加數據。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using MongoDB.Driver; 6 using MongoDB.Bson; 7 using MongoDB.Driver.GridFS; 8 using MongoDB.Bson.Serialization.Attributes; MagicMongoDBTool.Module 11 { InitTestData 13 { User 15 { 16 [BsonId] 17 public String ID; )] 19 public String Name; 20 public Byte Age; 21 public Byte Age2; 22 public Byte Age3; 23 public Address address; 24 } Address 26 { 27 public String street; 28 public String City; 29 public String state; Zip; 31 32 } GeoObject 34 { 35 [BsonId] 36 public String ID; [] Geo; 38 } TLLObject 40 { 41 [BsonId] 42 public String ID; 43 public DateTime CreateDateTime; Game; 45 } FillDataForGeoObject(MongoServer mongosvr) 47 { ); ); 50 mongoCol.RemoveAll(); 51 Random Ro = new Random(); (int i = 0; i 1000; i++) 54 { 55 mongoCol.Insert(new GeoObject() 56 { 57 ID = i.ToString(), 58 Geo = new int[2] { Ro.Next() % 180, Ro.Next() % 180 } }); 61 } 62 } FillDataForTTL(MongoServer mongosvr) 64 { ); ); 67 mongoCol.RemoveAll(); 68 Random Ro = new Random(); (int i = 0; i 1000; i++) 71 { 72 mongoCol.Insert(new TLLObject() 73 { 74 ID = i.ToString(), 75 CreateDateTime = System.DateTime.Now.AddSeconds(i), 76 Game = Ro.Next() 77 }); 78 } 79 } FillDataForUser(MongoServer mongosvr) 81 { ); ); 85 mongoJsCol.Insert( , ) , )); 88 MongoGridFS mongofs = mongodb.GetGridFS(new MongoGridFSSettings()); ); 90 mongoCol.RemoveAll(); 91 Random Ro = new Random(); (int i = 0; i 1000; i++) 94 { 95 mongoCol.Insert(new User() 96 { 97 ID = i.ToString(), , 99 Age = (byte)Ro.Next(100), 100 Age2 = (byte)Ro.Next(100), 101 Age3 = (byte)Ro.Next(100), 102 address = new Address() 103 { , , , 107 Zip = Ro.Next(20) 108 } 109 }); 110 } 111 } 112 } 113 }

這里我新建了一個mongodb的數據庫,同時新增了3個演示用數據集(collection)。

具體的操作方法,推薦 碼農的文章:? MongoDB的C#驅動程序教程(譯)

這里有非常詳細的C#操作數據庫的解釋。全部是官方文檔的翻譯,可能是機器翻譯的,但是對于英語不好的同志來說,有一定幫助。

當然,如果你的英語還可以,原汁原味的在這里:+Driver+Tutorial

MongoDB的對象存取,代碼看上去有點ORM的味道,不過,由于MongoDB已經是階層數據庫了,完全不需要將Object進行映射(Map),而是直接存取到數據庫中。

在簡單類的時候,由于數據結構只是二維表格,這種優勢不是很明顯。在復雜類的時候,出現層次結構的時候,則效果非常明顯。

下圖則通過[樹形視圖]來直觀展示了復雜階層的類。

關系型數據庫,需要將User數據和Address數據放在兩張表中,然后用主鍵連接成視圖。

階層型數據庫,香港服務器,則已經將User和Address信息放在一個文檔(Document,類似于記錄的概念)里面。

(當然,關系型的好處也非常明顯,可以減少數據冗余,靈活性也非常好。階層型數據庫在編碼上,可能更加貼近OOP)

?

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

?[索引-TTL索引]

?索引都是為了檢索的性能而生的,MongoDB的索引也不例外。

?TTL(TimeToLive)索引(MongoDB2.2.2新增)和地理位置索引(“2d”)則是MongoDB的特色。

?TTL索引,索引對象是一個日期型字段,然后需要設定一個有效時間。通過監視 日期型字段的值和當前系統時間,參考有效時間,判斷是否數據過期,對于過期的數據則自動刪除。

?這個特性對于自動刪除日志這樣的操作來說,將非常有用。例如我們可以對于 日志創建時間 進行索引,同時設定過期時間為 3600秒,這樣系統將自動刪除一個小時之前的日志。

?這里我們準備了TTL這樣的一個數據集:

?數據集里面包含了一個CreateDateTime的日期型字段,里面存放著建立記錄的時間。

?接著我們選中數據集,通過索引管理器建立索引。

?我們將對于CreateDateTime建立所以,同時設定有效時間為180秒。

?這樣的話,如果CreateDateTime和系統時間相差180秒,則記錄將會被自動刪除。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

1.TTL索引必須建立在日期型字段(或者日期型字段數組)

2.不能建立在復雜索引上

3.你不能在 _id或者任何一個已經存在索引的字段上建立TTL索引

TTL索引的官方說明:?

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

注意上面這張圖的左邊,顯示了數據集的索引信息:

AutoDelete的索引過期時間為180秒。而默認的索引_id,則沒有設定過期時間。

同時,里面的數據已經全部被系統自動刪除掉了。

[索引-GEO索引]

如果,你的數據集里面有一個地理位置字段(所謂的地理位置字段,是一個數組,數組里面有兩個數字,數字的范圍是 [-180,180])。

例如,下面的Geo字段,就是一個地理位置字段。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

?我們可以對于地理位置字段,進行“2d”索引,美國空間,或者說是Geo索引。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

觀察一下索引類型:這里顯示的是 “2d”,表示這是一個Geo地理索引

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

建立過地理索引的數據集,可以進行GeoNear查詢。

官方文檔:?

GeoNear的意思就是:查詢一下,指定的坐標附近,有那些記錄。

你可以指定:? 1.需要查詢多少個最鄰近的記錄。

????????????????? 2.你可以限制最大的距離。

????????????????? 3.由于地理坐標的單位是弧度【-180,180】,有時候你需要將距離放大一些,你可以指定距離乘積

???????????????? 4.Spherical(球形)

下面我們要查詢離坐標 【100,100】,距離在10以內的記錄,我們限制最多查詢100個記錄。

并且我們不需要系統對于距離進行放大或者縮小的處理。

[教程]MongoDB 從入門到進階 (概要 以及 高級索引篇 TimeToLive

查詢結果:我們掃描了23個記錄(由于有索引,所以不需要掃描全部記錄),掃描時間為0

????????????? 符合條件的記錄有6個,平均距離為 6.34 最大距離為 9.21

????????????? 每條記錄的詳細信息都可以在結果里面看到。

?

????????????

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享