A.
Mongodb特色、功能、使用場景
Mongodb的安裝和配置
Mongodb體系結構
數據庫的啓動、中止、鏈接
JSON/BSON數據格式
Mongodb
1. 特色
數據在內存中,經過後臺線程寫入磁盤
無模式結構進行數據存儲---->如產品數據,不一樣的產品描述徹底不同,那麼若是用關係數據庫很難處理
能夠進行實時插入(寫性能很是好)
自動碎片處理
存儲數據格式是二進制json格式===>bson
支持二進制數據和大型對象(圖片)
2.使用場景
網站數據 Mongodb 很是適合實時的插入,更新、查詢,而且具有了網站實時數據存儲所須要的複製及高度伸縮性
緩存:做用信息數據的緩存層
大尺寸,低價值的數據
高伸縮性,適合百臺服務器組成的數據庫集羣有,MapReduce引擎的內置支持。
3. 不適用場景
.高度事務性的系統 例如銀行、會計
傳統的商業智能應用
沒法控制數據寫入磁盤的順序
4.Mongodb 的安裝
windows版: 解壓、進入bin目錄(若是設置了環境變量無所謂那個目錄了)
在mongodb目錄下創建data文件夾,指定存放數據的目錄--->能夠是其它目錄
啓動命令 mongod --dbpath=d:\mongodb\data
客戶端鏈接:mongo
Linux版:
tar -zxvf mongodb-linux-i686-2.6.3.tgz
創建日誌、數據文件夾
啓動命令:./mongod -dbpath=/usr/nosqlsoft/mongodb/db -logpath=/usr/nosqlsoft/mongodb/logs/mongo.log --fork
客戶端鏈接: ./mongojavascript
Mongodb啓動能夠有一些其它參數
dbpath
logpath 錯誤日誌文件
logappend 錯誤日誌採用的追加模式
bind_ip 對外服務綁定的ip,通常設置爲空
port 對外服務的端口(不想用默認的)
fork 之後臺以守護進行的方式運行服務
MaxConns
其它... ....php
5.體系結構
Mongodb 是一個可移植的數據庫,在不一樣平臺是徹底同樣的,數據的邏輯結構和數據存儲方式等等。
關係數據庫是數據庫的概念database Mongodb中是db的概念
關係數據庫 -->表 Mongodb--->Collection(集合)
關係數據庫 --->記錄 Mongodb --->document(文檔)vue
數據存儲結構
若是有數據庫foo 數據庫文件就會有foo.ns,foo.0,foo.1,foo.2等等java
Mongodb有預分配空間的機制,每一個預分配文件都用0進填充
Mongodb就始終保持額外的空間和空餘的數據文件,避免數據暴增加帶來的磁盤壓力寫過大的問題
數據文件每新分配一次,它的大小都會是上一個數據文件大小的2倍。最大2G
數據庫每張表(集合)對應一個命名空間,這寫數據都集中在.ns文件中
6. 數據格式 二進制json ====》bson格式
{"300001":{name:"上證指數",yes:3000.0,tod:2990.1,now:3002.73},"000001":{name:"浦發銀行",yes:23.22,tod:23.5,now:23.0}}
json格式類型執行很是快,且不昂貴
對js來講表示的對象
能夠跨域傳遞信息
-------------------------------------------------------------------------------------------------------------
B.
bson
Mongodb的增刪改查操做
Mongodb 客戶端GUI工具
Mongodb基本操做
1.bson 二進制的json
2.基本操做
關閉服務 :能夠直接ctrl+c關閉
也能夠是進入admin數據庫 use admin
db.shutdownServer()
2.1插入記錄的操做
j = {name:"zhangsan",age:30};
db.mydb.save(j)
t = {name:"lisi",age:32};
db.mydb.insert(j)
注意:不須要預先建立一個集合,在第一次插入數據時會自動建立。
文檔中能夠存儲任何結構的數據,實際應用中大部分仍是相同文檔的集合,這個比較靈活,結構不一樣也不要緊
每次插入數據的時候集合中都會有一個ID,屬性名稱是_id
寫一個循環插入數據:
for(var i = 1; i < 10;i++)db.mydb.save({x:3,j:i})linux
db.mydb.find()
若是屏幕沒有所有顯示可使用it命令顯示下一屏
2.2"_id"
存儲在Mongodb中的每個文檔都會有一個默認主鍵_id,名稱固定
能夠是任何類型,默認是ObjectId ,必須惟一
若是不用這個類型,必須顯示寫出 db.mydb.insert({"_id":"0001",name:"zhangsan"})web
2.3查詢操做
db.mydb.find()
var cursor = db.mydb.find();
while(cursor.hasNext()) printjson(cursor.next())
===============================
相似與js 腳本
db.mydb.find().forEach(printjson);正則表達式
================
在Mongodb的腳本當中
var cursor = db.mydb.find()
能夠把cursor當作一個數組來操做
printjson(cursor[0])
printjson(cursor[1]);
======================
var arr = db.mydb.find().toArray();
arr[0];
arr[1];
注意:這些特性只是在Mongodb shell裏使用,而不是全部其它應用程序都支持。
Mongodb 遊標對象不是沒有快照,若是有其餘用戶在集合裏第一次後者最後一次調用next(),你可能得不到遊標裏的數據,因此要明確鎖定你查詢的遊標
2.4 簡單的條件查詢
db.mydb.find({x:4}).forEach(printjson)
db.mydb.find({x:4,j:90}).forEach(printjson);
2.5 findOne()語法
只返回遊標中的第一條數據,或者返回null便是空數據
printjson(db.mydb.findOne({x:4}));
printjson(db.mydb.findOne({x:1000}));1000不存在返回null
2.6經過limit限制結果集的數量
db.mydb.find().limit(3);
2.7修改記錄
db.mydb.update({name:"zhangsan"},{$set:{name:"zhangsan_new"}})sql
db.mydb.update({屬性1:"值",屬性2:"值"...},{$set:{屬性:新值,屬性:新值}})
3.經常使用的工具集
bsondump:講bson格式的文件轉存爲json格式數據
mongo:客戶端命令行工具,其實也是一個js解釋器,支持js語法
mongod:數據庫服務器
mongodump/mongorestore 數據庫備份和回覆工具
mongoexport/mongoimport 數據導入導出工具
mongofiles:GridFs管理工具,實現二進制文件的存取
mongos:分片路由,若是使用sharding功能,應用程序鏈接的是mongos而不是mongod
mongostat:實時性能監控工具
4.客戶端GUI
MongoVUE http://www.mongovue.com 可視化工具
PHP寫的工具 RockMongo http://code.google.com/p/rock-php/
MongoHub 專門針對Mac系統的圖形管理界面mongodb
-------------------------------------------------------------------------------------------------------------------------------
C.
Mongodb 高級查詢
1.條件操做符
< ,<=,>,>=
db.collection.find({"field":{$gt:value}})//大於
db.mydb.find({"age":{$gt:30}});
db.collection.find({"field":{$lt:value}})//小於
db.collection.find({"field":{$gte:value}})//大於等於
db.collection.find({"field":{$lte:value}})//小於等於
多條件
db.collection.find({"field1":{$gt:value1,$lt:value2}})
db.mydb.find({"age":{$gte:30,$lte:32}});
db.mydb.find({"age":{$gte:30,$lte:32},"name":"lisi"});
2.$all 匹配全部
這個操做符合sql語法的in相似,不一樣的是,in只須要知足()中的某個便可,
而$all必須知足[]內的全部值:
db.mydb.insert({name:"zhaoliu",age:[30,32,34]});
db.mydb.find({"age":{$all:[30,32]}});
3.$exists 判斷字段是否存在
查詢含有age屬性的文檔
db.mydb.find({age:{$exists:true}})
查詢不含有age屬性的文檔
db.mydb.find({age:{$exists:false}})
4.NULL值處理
db.mydb.find({"age":{$in:[null],$exists:true}}); 查詢含有age屬性,而且值是null的shell
查詢的是沒有age屬性和有age屬性值爲null的文檔
db.mydb.find({"age":{$in:[null]}});
5.$mod取模運算
age屬性除以10餘數是2的文檔取出
db.mydb.find({age:{$mod:[10,2]}}); age屬性%10 ==2的
6.$ne 不等於
年齡不是30的,所有查詢出來 包含了不含age屬性的文檔,也包含了age屬性是null的文檔
db.mydb.find({age:{$ne:30}})
查詢有年齡屬性而且值不是30的。
db.mydb.find({age:{$ne:30,$exists:true}});
7.$in 與sql標準語法的用途是同樣的,即要查詢的是一系列枚舉範圍內.
db.mydb.find({age:{$in:[30,23]}})
8.$nin 不包含
db.mydb.find({age:{$nin:[30,23]}})
db.mydb.find({age:{$nin:[30,23],$exists:true}})
9.$size 數組元素的個數
db.mydb.find({age:{$size:3}})
db.mydb.find({age:{$size:1}})
db.mydb.insert({age:[100]});
db.mydb.find({age:{$size:1}})
10.正則表達式匹配
查詢不匹配name=z*帶頭的記錄
db.mydb.find({name:{$not:/^z.*/}})
db.mydb.find({name:{$not:/^z.*/,$exists:true}});
11.JavaScript查詢和$where查詢
查詢j 大於20的數據
db.mydb.find({j:{$gt:20}})
db.mydb.find({$where:"this.j>20"});
db.mydb.find("this.j>20")
=======================
f=function(){return this.j>20;}
db.mydb.find(f);
12.count查詢記錄條數
db.mydb.find().count()
db.mydb.find({j:{$gt:90}}).count()
13.skip限制返回文檔的起點
從第3條記錄開始,返回5條記錄
db.mydb.find().skip(3).limit(5);
14.sort
db.mydb.find({age:{$exists:true}}).sort({age:1})升序
db.mydb.find({j:{$exists:true}}).sort({j:-1});
----------------------------------------------------------------------------------
D:
mongodb高級應用
存儲過程
capped Collection使用
GridFs實現海量數據存儲
Mongodb的MapReduce實現
1.遊標
1>
for(var a=db.person.find();a.hasNext();){
printjson(a.next());
}
2>
var a = db.person.find();
while(a.hasNext()){
printjson(a.next());
}
3>
db.person.find().forEach(function(u){ printjson(u)});
2.存儲過程
mongodb的存儲過程利用javascript書寫
sql自定義函數
function addNumbers(x,y){
return x+y;
}
sql自定義函數轉換成存儲過程db.system.js.save();
1)定義存儲過程
db.system.js.save({"_id":"addNumbers",value:function(x,y){ return x+y;}});
--->_id:對應至關有函數名 value:對應函數體
這樣造成了mongodb的存儲過程
2)查看存儲過程:
db.system.js.find();
3)執行存儲過程
db.eval('語句');
如:
db.eval('addNumbers(2,3)');
注意:eval()是個特殊函數,能夠不定義存儲過程,直接內部嵌套函數使用
db.eval(function(){ return 3+3;});
-----------------------------------------------------
db.system.js.save({"_id":"getCount",value:function(){ return db.person.count();}});
調用
db.eval('getCount()');
注意:js的語法與mongodb的基本操做
3.capped collection
性能比較出色
1)-種特殊集合,固定大小的集合,數據滿了後按lru(最近最少使用)和按着插入順序對老化數據移除
2)創建是預先指定大小,數據滿後,再增長數據,將最老數據替換掉
3)能夠插入和更新,不能查過集合的大小不然更新失敗
4)不能夠刪除,能夠經過drop刪除集合中全部行,刪除後,集合須要重建
5)32位機器上,一個capped collection最大爲483.5m
64位機器上無限制
****用途
(1)loggging 作日誌,將系統日誌寫入, 能夠減小人員維護(自動清理lru),同時capped collection能夠查看最近的插入數據(自動維護查詢順序),capped collection有最大容量限制
(2)cached
(3)auto archiving 將統計的中間結果記錄到capped collection中,便於統計提取
發揮最大性能
利用寫入特性,寫入多,讀取少,最少不要創建索引,不然影響插入速度
利用天然排序也就是維護插入順序
使用時候注意事項
創建時候設定maxsize,和 初始size,由於capped collection使用時候,老是先檢查size再檢查max
能夠利用validate查看使用了多少,以便決定設定多大
建立cappped collection語法
db.createCollection("capcol",{cappped:true,size:100000,max:100});
建立普通:collection
db.createCollection("mu");
刪除集合中的元素
db.collectionName.drop();
注意:
默認狀況下系統會自動爲collection建立索引,可是不會對capped collection建立索引
4.GridFs
是mongodb的一種存儲大型文件的規範
內部提供了將大型文件進行存儲,將文件分紅若干個小塊(小文檔進行存儲)
能夠存放圖片或視頻文件
注意:在互聯網中通常用針對性的分佈式文件系統存放文件、視頻等hdfs gfs tfs
GridFs存放和查看文件
GridFs利用兩個集合存放文件,默認前綴爲fs
即
1)files 存放元數據對象
2)chunks存放相關係統二進制塊
fs.files fs.chunks
命令
mongodbfiles put d:\\filename
mongodbfiles list
db.fs.files.find();
如
mongofiles put d:\\ddd.pdf
mongofiles list
獲取文件
mongofile get filename
如
mongofiles get d:\\ddd.pdf
客戶端查看:
show collections;
能夠顯示 fs.chunks,fs.files
db.fs.files.find();查看字段說明
filename:文件存放名稱
chunkSize:分塊大小
uploadDate:入庫時間
md5:加密方式
connected to: 127.0.0.1
added file: { _id: ObjectId('54f48b837ea57845ede86935'), filename: "d:\\ddd.pdf"
, chunkSize: 261120, uploadDate: new Date(1425312644357), md5: "21c7b1d4d246f779
20f45f5ed855f23c", length: 49307054 }
============================================
E:Mongodb管理
1.MapReduce
很像關係數據庫中的分組操做
Mongodb使用Map/Reduce進行並行統計
Mongodb使用MapReduce須要使用兩個函數,一個Map函數還有一個就是Reduce函數。
Map函數是經過調用emit(key,value)遍歷collection中全部記錄,而後將key與value傳遞
給Reduce函數進行處理。這兩個函數均可以使用JS實現
經過db.runCommand或者是mapReduce命令來執行一個操做
map函數----->分解產生key values
reduce函數--->合併接受key values參數進行操做
a.準備數據
db.students.insert({classid:1,age:14,name:"Tom"});
db.students.insert({classid:1,age:14,name:"Tom"});
db.students.insert({classid:1,age:14,name:"Tom"});
db.students.insert({classid:2,age:9,name:"Tony"});
db.students.insert({classid:2,age:13,name:"Harry"});
db.students.insert({classid:2,age:19,name:"Vincent"});
db.students.insert({classid:1,age:14,name:"Bill"});
db.students.insert({classid:2,age:17,name:"Bruce"});
b.map函數
//至關於this.classid的值做爲key,1做爲對象的values
m = function(){emit(this.classid,1)};
c.reduce函數
r = function(key,values){
var x = 0;
values.forEach(function(v){x+=v});
return x;
}
d.執行
res = db.runCommand({
mapreduce:"students",
map:m,
reduce:r,
out:"students_res"
});
以此做爲進一步處理的函數
f = function(key,value){return {classid:key,count:value};}
res = db.runCommand({
mapreduce:"students",
map:m,
reduce:r,
out:"students_res",
finalize:f
});
加入一些條件
res = db.runCommand({
mapreduce:"students",
map:m,
reduce:r,
out:"students_res",
finalize:f,
query:{age:{$lt:10}}});
另一個案例
book1 = {name:"Understanding Java",pages:100};
book2 = {name:"Understanding Json",pages:200};
book3 = {name:"Understanding XML",pages:300};
book= {name:"Understanding webService",pages:400};
book={name:"Understanding Axis2",pages:150};
map函數
var map = function(){
if(this.pages>=250)
category = "Big Books";
else
category = "Small Books";
emit(category,this.name);
};
var reduce = function(key,values){
var sum = 0;
values.forEach(function(doc){
sum += 1;
});
return {books:sum};
};
執行
db.books.mapReduce(map,reduce,{out:"book_results"});
查看db.book_results.find();
2. 數據導出mongoexport
mongoexport -d test -c books -o d:\\books.dat ---->json格式
-d 指定數據庫 -c 集合 -o 文件
mongoexport -d test -c books -csv -o d:\\books_csv.dat ---->csv格式
3.導入
mongoimport -d test -c books d:\\books.dat --->json格式
mongoimport -d test -c books --type csv --headerline --file d:\\books_csv.dat--->導入csv格式數據
------------------------------------------------------------------------------------------
f.
osql第十八講-Mongodb服務器管理
1.備份與恢復
如何建立一個數據庫 use 數據庫名稱 若是數據庫存在直接打開,若是不存在建立並打開
use testdb
備份 mongodump -d 數據庫
mongodump -d testdb
會直接在當前目錄下建立已給dump目錄,用於存放備份出來的文件
能夠指定備份存放的目錄
mongodump -d testdb -o mydump
恢復
刪除數據庫 進入數據庫 use 數據庫名 db.dropDatabase();
mongorestore -d 數據庫名稱 dump/數據庫名稱
mongorestore -d testdb dump/testdb
mongorestore -d testdb 自定義文件夾的名字/testdb
能夠不用先刪除數據庫用的時候指定-drop 參數便可 先刪除表再向表中插入數據
mongorestore -d testdb -drop dump/testdb
2.訪問控制
前面Mongodb啓動後,均可以直接操做,並且是任意操做。這樣會帶來不安全。
咱們能夠:
綁定IP內網地址訪問mongodb服務
設置監聽端口
使用用戶名和口令
綁定IP
啓動的時候添加參數 --bind_ip
如:啓動時添加參數 --bind 192.168.0.3 --->只能該ip訪問
mongod --bind_ip 127.0.0.1 --dbpath=d:\mongodb\data就只能本機訪問了。
設定端口默認端口是27017
mongod --bind_ip 127.0.0.1 --port 28018 --dbpath=d:\mongodb\data
mongo 127.0.0.1:28018
用戶名和密碼
默認對全部的庫具備root權限,全部操做均可以進行。
能夠經過指定參數來設置。
只須要啓動--auth --->啓動了登錄驗證模塊 默認啓動以後操做都還能夠進行。
在最初的時候Mongodb都默認有一個admin數據庫(是空的)
admin.system.users中保存了比其它數據庫中設置的用戶權限更大的信息。
當admin.system.users中沒有添加任何用戶時,即便Mongodb啓動了驗證
模塊依然能夠進行任何操做。因此須要往該集合中增長文檔。
創建系統root用戶
db.addUser("root","1234");
db.auth("root","1234");
mongo -u root -p
輸入密碼1234
鏈接成功
之後啓動時,若是加了--auth 鏈接時必須經過用戶名密碼,不然能鏈接,不能進行其餘操做
Mongodb也支持爲某個特定的數據庫來設置用戶。
給test加個只讀用戶
db.addUser("用戶名","密碼",true)
用該用戶登陸 能進行只讀操做
3.命令操做 db.user.count(); mongo test --eval "printjson(db.user.count())"