MongoDB 是一個高效能,開源,無模式的文檔型資料庫,採用C++開發,是當前NoSQL資料庫中比較熱門的一種,在許多情境下可用於替代傳統的關係型資料庫或鍵/值儲存方式
MongoDB使用BSON作為資料存放區和傳輸的格式,BSON是一種類似JSON的二進位序列化文檔,支援嵌套對象和數組。MongoDB很像MySQL,document對應MySQL的row,collection對應MySQL的table
MongoDB服務端可運行在Linux、Windows或OS X平台,支援32位和64位應用,預設連接埠為27017。推薦運行在64位平台,因為MongoDB在32位元模式運行時支援的最大檔案尺寸為2GB
1,特點和功能
1) 特點
- 高效能、易部署、易使用,儲存資料非常方便。
- 面向集合儲存,易儲存物件類型的資料,模式自由。
- 支援動態查詢,支援完全索引,包含內部對象。
- 支援複製和故障恢複。
- 使用高效的位元據儲存,包括大型物件(如視頻等)。
- 自動處理片段,以支援雲端運算層次的擴充性
- 支援Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程式,社區中也提供了對Erlang及.NET等平台的驅動程式。
- 檔案儲存體格式為BSON(一種JSON的擴充),可通過網路訪問。
2) 功能
- 面向集合的儲存:適合儲存物件及JSON形式的資料。
- 動態查詢:Mongo支援豐富的查詢運算式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- 完整的索引支援:包括文檔內嵌對象及數組。Mongo的查詢最佳化工具會分析查詢運算式,並產生一個高效的查詢計劃。
- 查詢監視:Mongo包含一個監視工具用於分析資料庫操作的效能。
- 複製及自動容錯移轉:Mongo資料庫支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目標是提供冗餘及自動容錯移轉。
- 高效的傳統儲存方式:支援位元據及大型物件(如照片或圖片)
- 自動分區以支援雲層級的伸縮性:自動分區功能支援水平的資料庫叢集,可動態添加額外的機器。
2, 適用場合
- 網站資料:Mongo非常適合即時的插入,更新與查詢,並具備網站即時資料儲存所需的複製及高度伸縮性。
- 緩衝:由於效能很高,Mongo也適合作為資訊基礎設施的緩衝層。在系統重啟之後,由Mongo搭建的持久化緩衝層可以避免下層的資料來源 過載。
- 大尺寸,低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行儲存。
- 高伸縮性的情境:Mongo非常適合由數十或數百台伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的內建支援。
- 用於對象及JSON資料的儲存:Mongo的BSON資料格式非常適合文檔化格式的儲存及查詢。
3, 下載安裝
mongoDB 下載, 最新版本 mongodb-linux-x86_64-2.2.3.tgz
mongoDB 安裝:
tar zxvf mongodb-linux-x86_64-2.2.3.tgz
cd mongodb-linux-x86_64-2.2.3
sudo mkdir /opt/mongodb-2.2.3
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/
安裝完畢後,在瀏覽器URL欄輸入: http://localhost:27017/,出現下面內容則表示安裝成功!
4, 啟動關閉
1) 預設啟動
sudo ./bin/mongod (預設儲存檔案目錄為/data/db/, 沒有則建立 sudo mkdir -p /data/db/, 預設連接埠為27017)
2)指定目錄啟動
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ (儲存檔案目錄為/opt/mongodb-2.2.3/ , 沒有則建立)
3) 指定連接埠啟動
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ -p 27000 (連接埠修改為指定27000),啟動輸出如下:
MongoDB starting : pid=4222 port=27000 dbpath=/opt/mongodb-2.2.3/ 32-bit host=ubuntu
4) 後台啟動命令
sudo ./bin/mongod -shardsvr -replSet shard1 -port=27017 -dbpath=/opt/mongodb-2.2.3/ -logpath=/opt/mongodb-2.2.3/log -logappend -rest -fork
5) 後台關閉命令
$ .bin/mongod // 登入用戶端> use admin // 切換到管理員> db.shutdownServer() // 關閉mongodb
或者
> db.adminCommand({shutdown : 1, force : true})
> //or
> db.shutdownServer({force : true})
> db.adminCommand(shutdown : 1, force : true, timeoutsec : 5) // 逾時關閉
> //or
> db.shutdownServer({force : true, timeoutsec : 5})
6) 用戶端啟動
預設啟動: ./bin/mongo
指定連接埠啟動: ./bin/mongo --port 27000
7) 備份與恢複
$ sudo ./bin/mongodump -d foo -o /opt/mongodb-2.2.3/bk/ // 備份到bk目錄connected to: 127.0.0.1Tue Feb 5 20:58:13 DATABASE: foo to /opt/mongodb-2.2.3/bk/fooTue Feb 5 20:58:13 foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.bsonTue Feb 5 20:58:13 1 objectsTue Feb 5 20:58:13 Metadata for foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.metadata.json$ ./bin/mongorestore -d foo -c foo_test /opt/mongodb-2.2.3/bk/foo/foo_test.bson // 恢複foo_test集合connected to: 127.0.0.1Tue Feb 5 20:58:20 /opt/mongodb-2.2.3/bk/foo/foo_test.bsonTue Feb 5 20:58:20 going into namespace [foo.foo_test]Tue Feb 5 20:58:20 warning: Restoring to foo.foo_test without dropping. Restored data will be inserted without raising errors; check your server logTue Feb 5 20:58:20 WARNING: collection foo.foo_test exists with different options than are in the metadata.json file and not using --drop. Options in the metadata file will be ignored.1 objects foundTue Feb 5 20:58:20 Creating index: { key: { _id: 1 }, ns: "foo.foo_test", name: "_id_" }
5, 命令樣本
1) 啟動服務端
sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/
2) 啟動用戶端
./bin/mongo
3) 用戶端簡單命令
協助: help
顯示資料庫: show dbs;
選擇資料庫: use test;
插入資料: db.foo.save({homer:2});
查詢: db.foo.find();
結果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 2 }
更新: db.foo.update({"homer":2},{"homer":3}); // ( {}, {} ) 第一個{}是查詢條件,第二個{}是重新賦值
結果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 3 }
刪除: db.foo.remove({"homer":3});
複合插入:
> t={"homer":2, "name" : {"name1" : "yang", "name2" : "gang"} }
{ "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
> db.foo.insert(t);
> db.foo.find();
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
複合查詢:
> db.foo.find(); // 先查看集合中所有記錄
{ "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }
{ "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
>
> db.foo.find({"homer":2}); // 查詢包含特定內容的記錄
{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
MongoDB建立完整樣本:
> use test2 // test2資料庫不存在也可以執行,但不會立刻建立,需要執行insert操作時才建立switched to db test2> show dbs // 沒有test2,表明不是立刻建立local(empty)test0.0625GB>> db // 顯示當前正在使用的資料庫,test2不存在但正在使用中test2> db.createCollection("t2_test") // 建立集合{ "ok" : 1 }> t={"name": "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" }} // 初始化集合資料{"name" : "yanggang","sex" : "male","lover" : {"lover1" : "little dog","lover2" : "fish"}}> db.t2_test.insert(t) // 插入資料,此刻才會建立test2資料庫> db.t2_test.find() // 查詢{ "_id" : ObjectId("5110d685af69ad089b234002"), "name" : "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" } }> show dbs // 查看資料庫,多了test2local(empty)test0.0625GBtest20.0625GB
MongoDB刪除樣本:
> show collections // 顯示集合system.indexest2_test> db.t2_test.drop() // 刪除集合t2_testtrue> show collections // 驗證刪除成功system.indexes> db.test2.remove()> show dbs // 顯示資料庫local(empty)test0.0625GBtest20.0625GB> db // 顯示當前資料庫test2> db.dropDatabase() // 刪除資料庫{ "dropped" : "test2", "ok" : 1 }> show dbs // 驗證刪除成功local(empty)test0.0625GB
MongoDB 索引
> db.foo.find(){ "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }{ "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }{ "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }> db.foo.getIndexes()// 查看索引(_id為預設,不可刪除和修改)[{"v" : 1,"key" : {"_id" : 1},"ns" : "test.foo","name" : "_id_"}]> db.foo.ensureIndex({"homer":1})// 建立索引> db.foo.getIndexes()// 驗證建立索引[{"v" : 1,"key" : {"_id" : 1},"ns" : "test.foo","name" : "_id_"},{"v" : 1,"key" : {"homer" : 1},"ns" : "test.foo","name" : "homer_1"}]> db.foo.dropIndex({"homer":1})// 刪除索引{ "nIndexesWas" : 2, "ok" : 1 }> db.foo.getIndexes()// 驗證刪除索引[{"v" : 1,"key" : {"_id" : 1},"ns" : "test.foo","name" : "_id_"}]
6, 應用樣本
> db.foo_test.insert({"homer":1})> for(var i = 1; i<=5; i++) db.foo_test.save({"homer":2, "score":i}) // 數組產生> db.foo_test.find(){ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }{ "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }{ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }{ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }{ "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }> > var cursor = db.foo_test.find(); while(cursor.hasNext())printjson(cursor.next());// 遍曆數組{ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }{ "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }{ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }{ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }{ "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }> > var cursor = db.foo_test.find(); printjson(cursor[4])// 查詢(迭代){ "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }> var arr = db.foo_test.find().toArray(); arr[5]// 查詢(數組){ "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }> db.foo_test.find().limit(3)// 查詢(前三){ "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }{ "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }{ "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }
參考推薦:
MongoDB (官方)
MongoDB學習筆記
mongod參數說明
MongoDB應用
MongoDB中索引的用法