1. 程式人生 > >【面試虐菜】—— MongoDB知識整理

【面試虐菜】—— MongoDB知識整理

為什麼我們要使用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 ---- or
10 $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