mongoDB入門學習及搭建使用

mongoDB優勢

1、無數據結構限制

a.沒有表結構的概念,每條記錄可以有完全不同的結構
b.業務開發方便快捷
c.sql數據庫需要事先定義表結構再使用
可同時存儲數據如:{name:”小明”,sex:”男”}{name:”小紅”,address:”上海”}{name:”小蘭”,home:[{“山東”},{“江西”}]}

2、完全的索引支持

a.redis的key-value
b.hbase的單索引,二級索引需要自己實現
單鍵索引,多鍵索引:{x:1,y:1}
數組索引:[“apple”,”lemon”]
全文索引:“ i am a litte bird”(暫不支持中文)
地理位置索引:2D

3、方便的冗餘和擴展

a.複製集保證數據安全
b.分片擴展數據規模
結構類似於:
mogoDB結構圖
自身的分片數據功能具有數據均衡,簡單擴容與縮容,提供對數據庫的統一訪問入口,不需要在應用層分發,顯著減少人工成本

4、良好的技術支持

1、完善的文檔
2、齊全的驅動支持

linux下編譯mongoDB(官網還提供Windows等其他版本)

進入mogoDB源碼目錄
執行scons all [-j 12]
注:【-j 12】指代cpu核數存在多個的情況下用於加速編譯,這裏指定cpu 12個
linux下編譯mongoDB命令

搭建簡單的mongoDB服務

1、首先,創建一個叫做mongodb_simple的目錄,進入到目錄中
2、創建文件夾:data,用來存儲數據庫的數據文件
3、創建文件夾:log,用來存儲數據庫的日誌文件
4、創建文件夾:bin,用來存儲數據庫的可執行文件
5、創建文件夾:conf,用來存儲數據庫的配置文件
關於創建並編輯mongod.conf配置文件:
######
#指定啓動時的監聽端口號
port = 12345
#指定mongoDB數據存儲的目錄可以使用相對路徑也可以使用絕對路徑
dbpath = data
#指明日誌文件的位置,需要指定文件而不是文件夾
logpath = log/mongod.log
#在linux下指定啓動後臺進程,在Windows下無效
fork = true
######
指定mongoDB配置文件,成功後會顯示對應的信息
指定mongoDB配置文件

連接mongoDB服務器

連接方式有兩種

1、編譯時生成的客戶端連接(mongo)

mogobb連接操作
mongoDB數據庫連接
連接時出現警告,並提示用numact
可以按照如下命令啓動:
numact1 --interleave=all bin/mongod -f conf/mongod.conf
然後再次進行連接:
.bin/mongo 127.0.0.1:12345
終止mongo運行
db.shutdownServer或使用kill儘量不要使用kill -9
2、使用驅動進行連接

mongoDB的基本操作

顯示所有數據庫
show dbs
選擇指定數據庫
use imooc
刪除指定數據庫
db.dropDatabase()
mongo中將一張表成爲集合
寫入數據,格式爲json
db.imooc_collection.insert({x:1})
查看創建的表
show collections
查詢條件爲空,默認返回所有
db.imooc_collection.find()
插入數據,同時指定id,注:_id必須唯一
db.imooc_collection.insert({x:2,_id:1})
指定條件查詢
db.imooc_collection.find({x:1})
使用循環條件進行插入數據
for(i=3;i<100;i++)db.imooc_collection.insert({x:1})
計數查詢
db.imooc_collection.find.count()
跳過並限制數量排序查詢
db.imooc_collection.find().skip(3).limit(2).sort({x:1})
將x爲1的數據更新爲999
db.imooc_collection.update({x:1},{x:999})
部分更新操作,修改數據{x:100,y:100,z:100},單獨修改y值
db.imooc_collection.update({z:100},{$set:{y:99}})
將一條不存在的數據更新,不存在則不進行任何操作
db.imooc_collection.update({y:100},{y:999})
將一條不存在的數據更新,不存在則插入該數據
db.imooc_collection.update({y:100},{y:999},true)
同時更新多條符合條件的數據
db.imooc_collection.update({c:1},{$set:{c:2}},false,true)
刪除指定條件的數據,remove()條件不能爲空
db.imooc_collection.remove({c:2})
刪除指定表
db.imooc_collection.drop()
查看集合的索引情況
db.imooc_collection.getIndexes()
創建索引,給定正值時表示正向索引,負值表示逆向索引
如果系統負載較重,且有許多已經存在的文檔不能使用該命令,應在使用數據庫前將索引創建完,否則嚴重影響數據庫性能;索引雖然帶來寫入的變慢,但查找速度明顯變快,因此基本忽略該影響
db.imooc_collection.ensureIndex({x:1})

mongoDB常見查詢索引

  • _id索引

    _id索引是絕大多數集合默認建立的索引
    對於每個插入的數據,mongoDB都會自動生成一條唯一的_id字段

  • 單鍵索引

單鍵索引是最普通的索引,不會自動創建,索引允許重複創建,重複創建時直接返回成功
db.imooc_collection.ensureIndex({x:1})

  • 多鍵索引(多鍵索引與單鍵索引創建形式相同,區別在於字段的值)

    單鍵索引:值爲一個單一的值,例如字符串,數字或者日期
    多鍵索引:值具有多個記錄,例如數組,前面已經爲下面的數組創建多鍵索引
    db.imooc_collection.insert({x:[1,2,3,4,5]})

  • 複合索引

當我們的查詢條件不只有一個時,就需要建立複合索引
對於插入的數據{x:1,y:2,z:3}創建複合索引
db.collection.ensureIndex({x:1,y:1})

  • 過期索引

1、過期索引:是在一段時間後會過期的索引
2、在索引過期後,相應的數據會被刪除
3、這適合存儲一些在一段時間之後會失效的數據如用戶的登錄信息、存儲的日誌
4、建立方法:
db.collection.ensureIndex({time:1},{expireAfterSeconds:10})
過期索引的限制
1、存儲在過期索引字段的值必須是指定的時間類型
說明:必須是ISODate或者ISODate數組,不能使用時間戳,否則不能被自動刪除
2、如果指定了ISODate數組,則按照最小的時間進行刪除
3、過期索引不能是複合索引
說明:不能指定兩個過期時間
4、刪除時間不是精確的、
說明:刪除過程是由後臺程序每60s跑一次,而且刪除也需要一些時間,所以存在誤差

mongoDB全文索引

全文索引:對字符串與字符串數組創建全文可搜索的索引
建立方法(這裏的artcles指articles集合):
db.articles.ensureIndex({key:"text"})
db.articles.ensureIndex({key_1:"text",key_2:"text”})
db.articles.ensureIndex({"$**":"text"})

如何使用全文索引
db.articles.find({$text:{$search:"coffee"}})
db.articles.find({$text:{$search:"aa bb cc"}})匹配多個關鍵詞或查詢
db.articles.find({$text:{$search:"aa bb -cc"}})排除關鍵詞cc
db.artcles.find({$text:{$search:"\"aa\" bb cc"}})匹配多個關鍵詞與查詢

全文相似度查詢
$meta操作符:{score:{$meta:”textScore”}}寫在查詢條件後可以返回返回結果的相似度
與sort一起使用,可以達到很好的實用效果
db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
mongoDB全文索引使用限制
每次查詢,只能指定一個$text查詢
$text查詢不能出現在$nor查詢中
查詢中如果包含了$text,hint不再起作用
mongoDB全文索引不支持中文

索引屬性

比較重要的屬性:
名字,唯一性,稀疏性,是否定時刪除
設置索引名字
db.collection.ensureIndex({},name:"")
指定索引唯一性
db.collection.ensureIndex({},unique:true/false)
指定索引稀疏性(默認情況下,mongoDB是不稀疏索引)
索引稀疏可以將不存在的文檔不給予索引有利於減少磁盤佔用,增大插入速度
但使用稀疏索引也存在無法查找字段不存在的記錄隱患,應當避免這麼做。
db.collection.ensureIndex({},sparse:true/false)

地理位置索引

概念;將一些點的位置存儲在mongoDB中,創建索引後,可以按照位置來查找其他點

  • 子分類:
    2d索引,用於存儲和查找平面上的點
    2dsphere索引,用於存儲和查找球面上的點
    查找方式:
    1、查找距離某個點一定距離內的點
    2、查找包含在某個區域內的點

2d索引(平面地理位置索引)

此處location是location集合
創建方式:

db.collection.ensureIndex({w:"2d"})

位置表示方式:

經緯度[經度,緯度]
取值範圍:經度[-180,180]緯度[-90,90]
db.location.insert({w,[1,1]})

查詢方式:

(1)$near查詢:查詢距離某個點最近的點
(2)$geoWithin查詢:查詢某個形狀內的點

形狀的表示

1、$box:矩形,使用{$box:[[<x1,y1>],[<x2,y2>]]}表示
2、$center:圓形,使用{$center:[[<x1,y1>],r]}表示指定圓心和半徑
3、$polygon:多邊形,使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示

形狀內的點查找

查找矩形內的點
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
查找圓內的點
db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})
查找多邊形內的點
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})

geoNear查詢

geoNear使用runCommand命令進行使用,常用使用如下:
db.runCommand({geoNear:,near:[x,y],mnDistance:(對2d索引無效),maxDistance:,num:,…})
如:db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:2})

2dsphere索引(球面地理位置索引)

創建方式

db.collection.ensureIndex({w:”2dsphere”})

位置表示方式:

GeoJSON:描述一個點,一條直線,多邊形等形狀

格式;

{type;“”, coordinates:[]}

查詢方式:

與2d索引查詢方式類似,支持minDistance maxDistance

索引構建情況分析

索引好處

加快索引相關的查詢

索引的缺陷

增加磁盤空間消耗,降低寫入性能

如何評判當前索引構建情況

1、mongostat工具
2、profile集合
3、日誌
4、explain分析

mongostat

用於查看mongodb運行狀態的程序
使用說明:mongostat -h 127.0.0.1:1234


  • 字段解釋

inserts:每秒插入數
query:每秒查詢數
update:每秒更新數
delete:每秒刪除數
getmore:每秒獲取更多的數
command:每秒執行命令數
flushes:每秒內存向磁盤刷新數據次數
mapped,vsized,res:mongodb數據 磁盤佔據大小和內存佔用大小
faults:如果數據沒有事先從磁盤加載到內存,需要到磁盤讀取。值越大說明效率越低
idx miss 索引沒有命中的比率,值越大說明索引創建的越差
qr/qw mongo寫隊列和讀隊列情況,值越大,性能越差
ar/aw 當前活躍的客戶端的數目
netIn,netOut網卡的流量
conn 當前mongo連接數量

profile(mongo慢查詢日誌)

tips:db.get…()等一系列命令可以使用tab鍵補全,或摁兩下tab獲取提示

db.getPrefilingLevel()獲取級別
db.getProfilingStatus()獲取詳細的狀態信息
profile分爲3個級別分別爲0,1,2
0表示profile關閉不進行任何操作
1表示profile配合slowms做預製,記錄所有超過slowms的操作
2表示profile記錄任何操作
db.setProfilingLevel(2)設置profile級別爲2
db.system.profile.find().sort({$natural:-1}).limit(10)查看記錄的system.profile集合,這裏排序不是必須的,排序natural自然排序一般按照寫入順序進行排序
mongo的profile
“query”表示查詢
“order by”表示排序
“cursorid”遊標id
“ntoreturn”返回的數據
“ntoskip”跳過的數
“nsanned”掃描的索引數
“nscannedObjects”掃描的實體數,當掃描索引仍不能確認掃描的數據是需要的時才掃描實體,所以一般nsanned大於等於nscannedObjects
注:當系統開啓profile時,系統記錄數據比較大,會明顯降低系統性能,因此profile使用一般在系統上線階段或剛上線的調試階段,生產中不建議使用

mongodb日誌

配置mongod.conf中的參數時
verbose級別從一個“v”到五個“v”,
級別越高也就是“v”越多,日誌記錄詳細度越高
會記錄連接和操作等信息

explain

可以特定分析某個索引或查詢的性能,mills是耗時
db.imooc.find({x:100}).explain()

mongoDB安全

概覽

1、最安全的是物理隔離:不現實
2、網絡隔離其次
3、防火牆在其次
4、用戶名和密碼在最後

mongoDB開啓權限認證

默認情況下,不開啓mongoDB的權限認證
兩種方式開啓
1、auth開啓
在mongod.conf中寫入auth等於ture 然後啓動或重啓mongoDB
在未創建用戶的情況下依舊可以連接上mongo,需要創建用戶
2、keyfile開啓

mongoDB創建用戶

1、創建語法:createUser(2.6之前未addUser)
2{user:"<name>",pwd:"<cleartext password>",customData:{<any information>},roles:[{role:"<role>",db:"<database>"}]}
3、角色類型:內建類型(read,readWrite,dbAdmin,dbOwner,useAdmin)
4、db.createUser({user:"imooc",pwd:"imooc",roles:[{role:"userAdmin",db:"admin"},{role:"read",db:"test"}]})

mongoDB用戶角色

1、數據庫角色(read.readWrite,dbAdmin,dbOwner,userAdmin)
2、集羣角色(clusterAdmin,clusterManager…)
3、備份角色(backup,restore…)
4、其他特殊權限(DBAdminAnyDatabase…)
總結來自慕課網mogoDB入門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章