標籤:des style blog http color io os 使用 java
為什麼我們要使用MongoDB?
特點:
- 高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:
- 面向集合儲存,易儲存物件類型的資料。
- 模式自由。
- 支援動態查詢。
- 支援完全索引,包含內部對象。
- 支援查詢。
- 支援複製和故障恢複。
- 使用高效的位元據儲存,包括大型物件(如視頻等)。
- 自動處理片段,以支援雲端運算層次的擴充性
- 支援Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程式,社區中也提供了對Erlang及.NET等平台的驅動程式。
- 檔案儲存體格式為BSON(一種JSON的擴充)。
- 可通過網路訪問。
功能:
- 面向集合的儲存:適合儲存物件及JSON形式的資料。
- 動態查詢:Mongo支援豐富的查詢運算式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- 完整的索引支援:包括文檔內嵌對象及數組。Mongo的查詢最佳化工具會分析查詢運算式,並產生一個高效的查詢計劃。
- 查詢監視:Mongo包含一個監視工具用於分析資料庫操作的效能。
- 複製及自動容錯移轉:Mongo資料庫支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目標是提供冗餘及自動容錯移轉。
- 高效的傳統儲存方式:支援位元據及大型物件(如照片或圖片)
- 自動分區以支援雲層級的伸縮性:自動分區功能支援水平的資料庫叢集,可動態添加額外的機器。
適用場合:
- 網站資料:Mongo非常適合即時的插入,更新與查詢,並具備網站即時資料儲存所需的複製及高度伸縮性。
- 緩衝:由於效能很高,Mongo也適合作為資訊基礎設施的緩衝層。在系統重啟之後,由Mongo搭建的持久化緩衝層可以避免下層的資料來源 過載。
- 大尺寸,低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行儲存。
- 高伸縮性的情境:Mongo非常適合由數十或數百台伺服器組成的資料庫。Mongo的路線圖中已經包含對MapReduce引擎的內建支援。
- 用於對象及JSON資料的儲存:Mongo的BSON資料格式非常適合文檔化格式的儲存及查詢。
MongoDB要注意的問題
1 因為MongoDB是全索引的,所以它直接把索引放在記憶體中,因此最多支援2.5G的資料。如果是64位的會更多。
2 因為沒有恢複機制,因此要做好資料備份
3 因為預設監聽地址是127.0.0.1,因此要進行身分識別驗證,否則不夠安全;如果是自己使用,建議配置成localhost主機名稱
4 通過GetLastError確保變更。(這個不懂,實際中沒用過)
MongoDB結構介紹
MongoDB中儲存的對象時BSON,是一種類似JSON的二進位檔案,它是由許多的索引值對組成。如下所示
{ "name" : "huangz", "age" : 20, "sex" : "male" } { "name" : "jack", "class" : 3, "grade" : 3 }
而資料庫的整體結構組成如下:
索引值對--》文檔--》集合--》資料庫
MongoDB的檔案單個大小不超過4M,但是新版本後可提升到16M
MongoDB中的key命名規則如下:
- "\0"不能使用
- 帶有"."號,"_"號和"$"號首碼的Key被保留
- 大小寫有區別,Age不同於age
- 同一個文檔不能有相同的Key
- 除了上面幾條規則外,其他所有UTF-8字元都可以使用
常用命令
1 #進入資料庫
use admin
2 #增加或修改密碼
db.addUser(‘xingoo‘,‘123‘)
db.addUser("xingoo","123",true) 參數分別為 使用者名稱、密碼、是否唯讀
3 #查看使用者列表
db.system.users.find()
4 #使用者認證
db.auth(‘xingoo‘,‘123‘)
5 #刪除使用者
db.removeUser(‘xingoo‘)
6 #查看所有使用者
show users
7 #查看所有資料庫
show dbs
8 #查看所有的collection集合
show collections
9 #查看各個collection的狀態
db.printCollectionStats()
10 #查看主從複製狀態
db.printReplicationInfo()
11 #修複資料庫
db.repairDatabase()
12 #設定profiling,0:off 1:slow 2 all
db.setProfilingLevel(1)
13 #查看profiling
show profiling
14 #拷貝資料庫
db.copyDatabase(‘xingootest‘,‘xingootest1‘)
db.copyDatabase("xingootest","temp","127.0.0.1")
15 #刪除集合collection
db.xingootest.drop()
16 #刪除當前資料庫
db.dropDatabase()
MongoDB增刪改命令
1 #儲存嵌套的對象
db.foo.save({‘name‘:xingoo,‘age‘:25,‘address‘:{‘city‘:‘changchun‘,‘Province‘:‘Jilin‘}})
2 #儲存數組對象
db.foo.save({‘name‘:xingoo,‘age‘:25,‘address‘:[‘Jilin Province‘,‘Liaoning Province‘]})
3 #根據query條件修改,如果不存在則插入,允許修改多條記錄
db.foo.update({‘age‘:‘25‘},{‘$set‘:{‘name‘:‘xingoo‘}},upsert=true,multi=true)
4 #刪除yy=5的記錄
db.foo.remove({‘name‘:‘xingoo‘})
5 #刪除所有的記錄
db.foo.remove()
索引
1 #增加索引:1 asc -1 desc
db.foo.ensureIndex({firstname:1,lastname:-1},{unieap:true})
2 #索引子物件(不懂)
db.foo.ensureIndex({‘Al.Em‘:!})
3 #查看索引資訊
db.foo.getIndexes()
db.foo.getIndexKeys()
4 #根據索引名刪除索引(不懂)
db.foo.dropIndex(‘Al.Em_1‘)
查詢
條件操作符
1 $gt ---- > 2 $lt ---- < 3 $gte ---- >= 4 $lte ---- <= 5 $ne ---- != 、<> 6 $in ---- in 7 $nin ---- not in 8 $all ---- all 9 $or ---- or10 $not ---- 反匹配
1 #查詢所有記錄
db.foo.find() ---- select * from foo
2 #查詢某列非重複的記錄
db.foo.distinct("xingoo") ---- select distinct name from foo
3 #查詢age = 22 的記錄
db.foo.find({"age":22}) ---- select * from foo where age = 22
4 #查詢age > 22 的記錄
db.foo.find({age:{$gt:22}}) ---- select * from foo where age > 22
5 #查詢age < 22 的記錄
db.foo.find({age:{$lt:22}}) ---- select * from foo where age < 22
6 #查詢age <= 25的記錄
db.foo.find({age:{$lte:25}})
7 #查詢age >= 23 並且 age <=26的記錄
db.foo.find({age:{$gte:23,$lte:26}})
8 #查詢name中包含xingoo的資料
db.foo.find({name:/xingoo/}) ---- select * from foo where name like ‘%xingoo%‘
9 #查詢name中以xingoo開頭的資料
db.foo.find({name:/^xingoo/}) ---- select * from foo where name like ‘xingoo%‘
10 #查詢指定列name、age的資料
db.foo.find({},{name:1,age:1}) ---- select name,age from foo
11 #查詢制定列name、age資料,並且age > 22
db.foo.find({age:{$gt:22}},{name:1,age:1}) ---- select name,age from foo where age >22
12 #按照年齡排序
升序:db.foo.find().sort({age:1}) 降序:db.foo.find().sort({age:-1})
13 #查詢name=xingoo.age=25的資料
db.foo.find({name:‘xingoo‘,age:22}) ---- select * from foo where name=‘xingoo‘ and age =‘25‘
14#查詢前5條資料
db.foo.find().limit(5) ---- select top 5 * from foo
15 #查詢10條以後的資料
db.foo.find().skip(10) ---- select * from foo where id not in (select top 10 * from foo);
16 #查詢在5-10之間的資料
db.foo.find().limit(10).skip(5)
17 #or與查詢
db.foo.find({$or:[{age:22},{age:25}]}) ---- select * from foo where age=22 or age =25
18 #查詢第一條資料
db.foo.findOne() 、db.foo.find().limit(1)---- select top 1 * from foo
19 #查詢某個結果集的記錄條數
db.foo.find({age:{$gte:25}}).count() ---- select count(*) from foo where age >= 20
20 #按照某列進行排序(不懂)
db.foo.find({sex:{$exists:true}}).count() ---- select count(sex) from foo
21 #查詢age模數10等於0的資料
db.foo.find(‘this.age % 10 == 0‘)、db.foo.find({age:{$mod:[10,0]}})
22 #匹配所有
db.foo.find({age:{$all:[22,25]}})
23 #查詢不匹配name=X*帶頭的記錄
db.foo.find({name:{$not:/^X.*/}})
24 #排除返回age欄位
db.foo.find({name:‘xingoo‘},{age:0})
25 #判斷欄位是否存在
db.foo.find({name:{$exists:true}})
管理
1 #查看collection資料大小
db.xingootest.dataSize()
2 #查看collection狀態
db.xingootest.stats()
3 #查詢所有索引的大小
db.xingootest.totalIndexSize()
參考資料:
【MongoDB介紹及安裝】http://database.51cto.com/art/201103/247882.htm
【MongoDB使用入門】http://www.linuxidc.com/Linux/2013-01/78251.htm
【面試虐菜】—— MongoDB知識整理