早就想寫一篇Mongodb的文章了,苦於木有時間呀,今天抽空將我所學習到的Mongodb知識整合一下,分享出來,部分Mongodb知識來源於網路.此處不給出連結,如果有侵犯,請及時聯絡我...
一,Mongodb簡介
Mongo(http://www.mongodb.org/)是一個高效能,開源(代震軍大牛正在研究Mongodb的源碼,大家可以去看看http://www.cnblogs.com/daizhj/),模式自由(schema-free)的文檔型資料庫,它在許多情境下可用於替代傳統的關係型資料庫或鍵/值(key-value)儲存方式。Mongo使用C++開發,
具有以下特性: 面向集合的儲存:適合儲存物件及JSON形式的資料。 動態查詢:Mongo支援豐富的查詢運算式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。 完整的索引支援:包括文檔內嵌對象及數組。Mongo的查詢最佳化工具會分析查詢運算式,並產生一個高效的查詢計劃。 查詢監視:Mongo包含一個監視工具用於分析資料庫操作的效能。 複製及自動容錯移轉:Mongo資料庫支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目標是提供冗餘及自動容錯移轉。 高效的傳統儲存方式:支援位元據及大型物件(如照片或圖片)。 自動分區以支援雲層級的伸縮性(處於早期alpha階段):自動分區功能支援水平的資料庫叢集,可動態添加額外的機器。 模式自由(schema-free),意味著對於儲存在mongodb資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案儲存體在同一個資料庫裡。 支援Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程式,社區中也提供了對Erlang及.NET等平台的驅動程式。
使用場合: 網站資料:Mongo非常適合即時的插入,更新與查詢,並具備網站即時資料儲存所需的複製及高度伸縮性。 緩衝:由於效能很高,Mongo也適合作為資訊基礎設施的緩衝層。在系統重啟之後,由Mongo搭建的持久化緩衝層可以避免下層的資料來源 過載。 大尺寸,低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行儲存。 高伸縮性的情境:Mongo非常適合由數十或數百台伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的內建支援。 用於對象及JSON資料的儲存:Mongo的BSON資料格式非常適合文檔化格式的儲存及查詢。
所謂“面向集合”(Collenction-Orented),意思是資料被分組儲存在資料集中,被稱為一個集合(Collenction)。每個集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型資料庫(RDBMS)裡的表(table),不同的是它不需要定義任何模式(schema)。 二,Ubuntu 下配置Mongodb
Ubuntu知識掃盲:
chown -R : 對目前目錄下的所有檔案與子目錄進行相同的許可權變更(即以遞迴的方式逐個變更)
nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思( n ohang up)。
Mongodb目前最新版本是1.8.1
首先啟動終端 :
輸入 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz
下載mongodb-linux-i686-1.8.1.tgz安裝包
解壓 tar -zxvf mongodb-linux-i686-1.8.1.tgz
預設情況下Mongodb會在/data/db/ 這個檔案夾存放資料
在目前的目錄下輸入如下命令,建立使用者 :
//添加一個mongodb使用者
adduser mongodbxiao
//設定密碼
passwd mongodb
繼續輸入
sudo mkdir -p /data/db/
//把"/data/db/”的屬主改成mongodb使用者
$ sudo chown mongodbxiao /data/db/
$ chown -R mongodb:mongodbxiao /data
當然 可以 通過--dbpath 命令 指定MongoDB將資料存放區到另外的目錄中去。
在運行下面的語句之前需要安裝一下mongo shell 否則會收到提示:程式“mongo”尚未安裝。
apt-get install mongodb-clients
運行資料庫
$ ./mongodb-linux-i686-1.8.1/bin/mongod
$ ./mongodb-linux-i686-1.8.1/bin/mongo
> db.test.save({123123:'哈哈哈'})
> db.test.find();
建立資料庫並添加一條記錄,最後查詢結果:
到此證明我們在Ubuntu下配置Mongodb成功..
ps:使用Ubuntu過程中經常會遇到這個錯誤:
只需要輸入強制解鎖,命令即可解決。
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock 三,Mongodb用戶端管理工具
Try MongoDB
不用安裝就可以試用MongoDB,和tryredis一樣,是一個基於web的shell類比工具,可以讓你在不用安裝MongoDB的情況下試用MongoDB的各種功能.
Mongo3 – MongoDB 叢集管理工具
MongoVUE
一個windows下的用戶端管理工具,我推薦這個,非常不錯.有點類似於mysql管理工具..
四,Mongodb C#版驅動
第一款:mongodb-csharp 項目地址:http://github.com/samus/mongodb-csharp
簡單介紹:該驅動是比較全的驅動,更新隨度非常快,有人已經應用到項目中去,並且表現非常好。目前他們的團隊正在致力於串連管理這部分功能的擴充例如:自動重連,串連池等等。
第二款:mongodb-net 項目地址:http://code.google.com/p/mongodb-net/
簡單介紹:該開發還在進行中,有些功能還沒有實現。
第三款:MongoDB.Emitter 項目地址:http://bitbucket.org/gwbasic/mongodb.emitter/
簡單介紹:提供了強型別支援
第四款:CSMongo 項目地址:http://somewebguy.wordpress.com/2010/02/21/building-a-mongo-driver-part-1/
簡單介紹:實現了部分功能,並且沒有可下載的代碼。但是你可以看他的部落格以瞭解這種驅動的思想。
第五款:simple- mongodb 項目地址:http://code.google.com/p/simple-mongodb/
簡單介紹:沒有提供原始碼,以JSon為核心。
最後一個是對第一款某些地方的增強,地址http://deserialized.com/convert-csharp-classes-to-and-from-mongodb-documents-automatically-using-net-reflection
第六款:NoRM 項目地址:http://github.com/atheken/NoRM
介紹:增強了第一種,支援強型別。 五,Mongodb 與sql 語句對照
此處用mysql中的sql語句做例子,C# 驅動用的是samus,也就是上文中介紹的第一種.
引入項目MongoDB.dll
//建立Mongo串連
var mongo = new Mongo("mongodb://localhost");
mongo.Connect();
//擷取一個資料庫,如果沒有會自動建立一個
var db = mongo.GetDatabase("movieReviews");
//建立一個列表,並為這個列表建立文檔
var movies = db.GetCollection("movies");
串連沒問題之後,現在讓我們用mysql 與mongodb的一些語句做下對比:
|
MongoDB |
Mysql |
查詢全部 |
movies.find(new Document()) |
SELECT * FROM movies |
條件查詢 |
movies.Find(new Document { { "title", "Hello Esr" } }); |
SELECT * FROM movies WHERE title= 'foobar' |
查詢數量 |
movies.Find(new Document { { "title", "測試2" } }).Documents.Count(); |
SELECT COUNT(*) FROM movies WHERE `title` = 'foobar' |
數量範圍查詢 |
1, movies.Find(new Document().Add("$where", new Code("this.num > 50")));
2, movies.Find(new Document().Add("num", new Document().Add("$gt",50))); ($gt : > ; $gte : >= ; $lt : < ; $lte : <= ; $ne : !=)
3,movies.Find("this.num > 50");
4,movies.Find(new Document().Add("$where",new Code("function(x){ return this.num > 50};"))); |
select * from movies where num > 50 |
分頁查詢 |
movies.Find(new Document()).Skip(10).Limit(20); |
SELECT * FROM movies limit 10,20 |
查詢排序語句 |
movies.Find(new Document()).Sort(new Document() { { "num", -1 } }); |
SELECT * FROM movies ORDER BY num DESC |
查詢指定欄位 |
movies.Find(new Document().Add("num", new Document().Add("$gt", 50)), 10, 0, new Document() { { "title", 1 } }); |
select title from movies where num > 50 |
插入語句 |
movies.Insert(new Document() { { "title", "測試" }, { "resuleData", DateTime.Now } }); |
INSERT INOT movies (`title`, `reauleDate`) values ('foobar',25) |
刪除語句 |
movies.Remove(new Document() { { "title", "Hello Esr" } }); |
DELETE * FROM movies |
更新語句 |
movies.Update(new Document() { { "title", "測試2" } } , new Document() { { "title", "測試11111" } }); |
UPDATE movies SET `title` = ‘測試1111’ WHERE `title` = '測試1111' |
Linq查詢 |
(from item in db.GetCollection("movies").Linq() where ((string)item["title"]).StartsWith("Esr") select item); |
select * from movies where title like ‘%Esr’ |
轉:http://www.cnblogs.com/xiaogangqq123/archive/2011/04/26/2029426.html