1
.mongoDB數據庫(NoSQL數據庫)
1.1
安裝(windows版本)
a.下載鏈接 www.mongodb.org
b.創建一個目錄用于存放安裝目錄,解壓安裝包
c.創建一個目錄用于存放數據
d.cd到安裝目錄 進入bin 執行 mongod.exe --dbpath 數據目錄全路徑
e.配置環境變量
f.啟動數據庫服務 自己修改mongodb.bat
mongod --dbpath
"d:/mongodb_data"
g.參考文檔配置啟動命令選項
h.客戶端連接
mongo
127.0
.
0.1
:
27017
(如果不改變端口,默認為
27017
)/admin(使用管理員登陸)
1.2
shell基本操作
1.2
.
1
對比
和關系型數據庫差異
對比項 mongodb MySQL
表 集合 table
行 文檔 行記錄
字段 鍵key 字段field
值 值value 值value
主外鍵 無 PK,FK
靈活性 極高 差
查詢 find sql
1.2
.
2
基本操作
1
.創建數據庫
use 數據庫名(如果此時什么都不干,離開時這個空數據庫會從緩存中刪除)
2
.查看所有數據庫
show dbs
3
.給指定的數據庫添加集合并添加記錄
db.persons.insert({name:
"test"
})
//此條命令執行完以后會自動為文檔插入id一列
其中:
db 表示所使用的數據庫
persons 表示集合
insert 表示集合操作
name 表示key
test 表示value
4
.查看數據庫中的所有文檔
show collections
5
.查詢指定文檔的數據
a.查詢所有
db.persons.find()
b.查詢一條數據
db.persons.findOne()
//查詢一行數據
6
.更新文檔數據
db.persons.update({name:
"test"
},{$set:{name:
"test1"
}})
//滿足條件多條記錄時,只更新第一條
//第一個{} 表示條件
//第二個{} 表示需修改的字段
7
.刪除文檔數據
db.persons.remove({name:
"123"
})
//{} 條件
8
.刪除庫中的集合
db.persons.drop()
9
.刪除數據庫
db.dropDatabase()
10
.shell的help
db.help()
//全局數據庫幫助
db.person.help()
//集合相關幫助
11
.API
http:
//api.mongodb.org/
12
.命名規范
1
.不能是空字符串
2
.特殊符號不能使用
3
.應全部小寫
4
.最多
64
字節
5
.不能跟現有的數據同名 如admin local
13
.可充當js引擎,可以執行js命令
1.3
BSON擴充的數據類型
1
.概述
BSON:是JSON的擴展,它新增了日期和浮點等JSON不支持的數據類型
1.4
MongoVUE————可視化工具
一開始不推薦 后期可查看相關命令
1.5
文檔數據
1
.插入
a.插入
db.文檔.insert.({key:value})
b.批量插入
shell不支持批量插入,只能使用
for
循環
for
(var i=
0
; i<
10
; i++){
db.perosns.insert({name:i})
}
c.save操作
save操作和insert操作的區別在于當遇到相同id情況下時:
save完成保存操作,而insert則報錯
2
.刪除
a.刪除列表中所有數據
db.persons.remove()
b.根據條件刪除數據
db.persons.remove({naem:
1
})
3
.更新
a.強硬式文件替換
db.persons.update({查詢器},{修改器})
//會導致新文檔替換舊文檔 新文檔為修改器里面的內容
b.主鍵沖突會報錯并停止更新操作
當更新文檔和已有文檔ID沖突時則系統報錯
c.insertOrUpdate操作
查詢器查出來的數據則執行更新操作,否則執行替換操作
db.persons.update({查詢器},{修改器},
true
)
d.批量更新操作(解決只更新一條數據問題)
db.persons.update({查詢器},{修改器},
false
,
true
)
//查詢器多條記錄時均更新
e.更新器
$set————用來指定一個鍵值對,存在則修改,不存在則添加
{$set:{key:value}}
$inc————用來指定的鍵對應的數字類型的數值進行加減操作
{$inc:{field:
1
}}
//field這個列的數值+1 如果減1則是-1
$unset————用來刪除指定鍵
{$unset:{field:value}}
$push————如果指定的鍵是數組則追加數值;如果指定鍵不存在則創建數組類型的鍵值對
{$push:{filed:value}}
$pushAll————用法和push差不多
{$pushAll:{field:array}}
//注意后面跟著是數組
$addToSet————用于添加鍵,如果存在則不操作
{$addToSet:{field:value}}
$pop————從指定數組中刪除一個值
{$pop:{filed:value}}
//其中value為1時代表最后一個數值,-1為第一個數值
$pull————刪除一個被指定的數值
{$pull:{
"name"
:
"test"
}}
$pullAll————一次性刪除多個指定的數值
{$pullAll:{
"name"
:[
"test"
,
"test1"
,
"test2"
]}}
$————數組定位器
4
.查詢
a.Find
1
.指定返回的鍵
db.persons.find({},{})
//第一個{}指定條件
//第二個{}指定需要返回的列
//其中id列默認情況下會返回 _id:0為不返回 name:1為返回那么列
2
.查詢條件
$lt -> < $lte -> <=
$gt -> > $gte -> >=
$ne -> !=
$in
$nin
$or
Null
$elemMatch ————數組查詢器
$where ————盡量避免使用。性能低
示例:
22
<=age<=
27
-> {age:{$gte:
22
,$lte:
27
}}
age !=
26
-> {age:{$ne:
26
}}
age in(
12
,
13
) -> {age:{$in:[
12
,
13
]}} --后接數組
age>
80
or age<
40
-> {$or:[{age:{$gt:
80
}},{age:{$lt:
40
}}]}
age is
null
-> {age:{$in:[
null
]}}
b.分頁和排序
1
.分頁
前幾條數據 ————limit()
db.persons.find().limit(
5
) --查詢前
5
條數據
前跨度數據 —————skip()
db.persons.find().limit(
3
).skip(
5
) --前
6
~
8
共三條 前面
5
條省略跳過
2
.排序 ————sort()
db.persons.find().limit(
3
).sort({name:
1
}) --前三行數據根據name升序排序 -
1
為倒序
db.persons.find().limit(
3
).sort({name:
1
,age:-
1
}) --先升序再倒序
c.游標和其他知識
1
.游標
var p = db.persons.find(); --得到游標
while
(p.hasNext()){ --遍歷游標
obj = p.next(); --指向下一條記錄
PRint(obj)
}
2
.游標銷毀的條件
1
.客戶端發來請求銷毀
2
.迭代完畢
3
.超過
10
分鐘沒用,自動清除
3
.查詢快照————針對不變的集合進行游標運動
高級查詢選項:
$query:doc doc 為字段 (field:value)
$orderby:doc
$maxsan:integer 做多掃描文檔個數
$min:doc 查詢開始
$max:doc 查詢結束
$hint:doc 使用哪個索引
$explain:
boolean
統計
$snapshot:
boolean
快照
示例:db.persons.find({$query:{name:
"jim"
},$snapshot:
true
},{_id:
0
})
1.6
常用函數
a.findAndModify函數————返回集合
b.runCommand函數————返回更新或者刪除的文檔
示例:
ps = db.runCommand({
"findAndModify"
:
"persons"
,
"query"
:{name:
"test"
},
"update"
:{
"$set"
:{
"age"
:
11
}},
"new"
:
true
}).value
--
"findAndModify"
集合名
--
"query"
查詢器
--
"update"
修改器
--
"new"
狀態--如果
true
表示返回結果是更新后的,
false
為更新前
--
"sort"
排序
c.Count函數————計數
db.persons.find({country:
"USA"
}).count() --查詢美國國籍的人數
d.Distinct函數————去重
db.runCommand({distinct:
"persons"
,key
"country"
}).values --查詢persons集合中一共有多少個國家,分別是什么
e.Group函數————分組
db.runCommand({
group:{
ns:集合名字,
Key:分組的鍵對象,
Initial:初始化累加器,
$reduce:組分解器,
Condition:條件,
Finalize:組完成器
}
})
說明:分組首先會按照key進行分區,每組的每個文檔全部要執行$reduce的方法,其中參數為:一個是組內本條記錄,一個是累加器數據
示例:
db.runCommand({
group:{
ns:
"persons"
,
key:{
"country"
:
true
},
initial:{m:
0
},
$reduce:function(doc,prev){
if
(doc.m > prev.m){
prev.m = doc.m;
prev.name = doc.name;
prev.country = doc.country;
}
},
condition:{m:{$gt:
90
}}
}
})
f.列出所有函數
1
.shell方式
db.listCommands()
2
.WEB方式
http:
//localhost:28017/_commands //注意啟動時需要加--rest 如: mongod --dbpath 數據目錄 --rest
1.7
索引
a.索引概述
1
.創建索引的時候注意正序還是倒序
2
.索引的創建在提高查詢性能的同時會影響插入性能
3
.符合索引要注意索引的先后順序
4
.每個鍵全建立索引不一定就能提高性能
b.管理索引
1
.創建索引
db.persons.ensureIndex({id:
1
},{unique:
true
})
id為索引列
1
為升序 -
1
為倒序
unique 為唯一索引
2
.刪除索引
db.runCommand({dropIndexs:
"persons"
,index:
"index_name"
}) 將persons的index_name索引刪除
db.runCommand({dropIndexs:
"persons"
,index:
"*"
}) 將persons的所有索引刪除
c.空間索引————二維空間索引,地圖時用到,具體找度娘
1.8
固定集合
1
.特性
a.固定集合默認是沒有索引的,就算是_id也是沒有索引的
b.由于不要分配新的空間,所以插入速度非???/code>
c.固定集合的順序是確定的,所以查詢速度非???/code>
d.最適合的是應用就是日志管理
2
.操作
a.創建一個名叫mycoll的固定集合要求大小在
100
個字節,可以存儲
10
個文檔
db.createColletion(
"mycoll"
,{size:
100
,capped:
true
,max:
10
})
b.把一個普通的集合轉換成固定集合
db.runCommand({convertCapped:
"persons"
,size=
10000
})
c.反向排序,默認是插入順序排序
db.mycoll.find().sort({$natural:-
1
})
1.9
GridFS
1
.簡述
GridFS是mongoDB自帶的文件系統,使用二進制的形式存儲文件
2
.利用的工具
mongofile.exe
3
.使用
a.查看GridFS的所有功能
cmd -> mongofiles
b.上傳一個文件
mongofiles -d 數據庫名 -l
"E:/t.txt"
put
"a.txt"
c.集合查看存儲文件的信息
db.fs.chunks.find()
db.fs.files.find()
d.集合中所有文件
mongofiles -d 數據庫名 list
1.10
其他腳本
1
.服務器端運行eval
db.eval(
"function(name){return name}"
,
"test"
)
2
.js的存儲
a.在服務上保存js變量供給函數全局調用
db.system.js.insert({_id:name,value:
"test"
})
//保存變量name
db.eval(
"{return name;}"
)
//調用變量 注意變量名必須定義。不然報錯
//其中js相當于關系型數據庫中的存儲過程,因為value值可以為函數
1.11
運維管理
1
.啟動配置
--dbpath 指定數據庫目錄 默認情況下在c:/data/db
--port 監聽端口 默認情況下是
27017
--fork 用守護進程方式啟動mongoDB
--logpath 指定日志輸出目錄 默認是控制臺
--config 指定啟動項用文件的路徑
--auth 用安全認證方式啟動數據庫
示例:
1
.使用config配置文件來啟動數據庫,將啟動端口改為
8888
mongodb.conf文件(安裝目錄下)
dbpath=D:/data
port=
8888
--啟動命令
mongod.exe --config ../mongodb.conf
--客戶端連接命令
//如果是在shell下操作 命令是mongo 127.0.0.1:8888
2
.停止數據庫服務
a ctrl+c組合鍵
b admin數據庫命令關閉
use admin
db.shutdownServer()
2
.導入/導出
a 導入數據
使用mongoimport命令
參數有
--db 指定數據庫
--collection 指定集合
--file 指定文件
--host 指定主機
--port 指定端口
示例:
mongoimport --db test --collection person --file
"D:/t.txt"
b 導出數據
使用mongoexport命令
參數有
-d 指定數據庫
-c 指定集合
-o 指定輸出文件
-csv 導出csv格式
-q 過濾導出
--type<json|csv|tsv>
--host 指定主機
--port 指定端口
示例:
1
.導出本機
mongoexport -d persons -c person -o
"D:/t.txt"
2
.導出其他主機
mongoexport --host hadoop --port
8888
c 備份/恢復
1
.運行時備份 mongodump
示例: mongodump --host
127.0
.
0.1
:
27017
-d test -o
"d:/bak"
--會根據數據庫新建同名文件夾
2
.運行時恢復 mongorestore
示例: mongorestore --host
127.0
.
0.1
:
27017
-d test -directoryperdb
"d:/bak/test"
3
.懶人備份 直接將數據文件拷貝
3
.鎖
a Fsync使用
數據庫結構圖:
讀寫操作->緩沖池->數據庫 (從上到下)
上鎖:將緩沖池的數據全部寫進數據庫中
示例:
use admin --選擇需要上鎖數據庫
db.runCommand({fsync:
1
,lock:
1
}); --上鎖
解鎖:當上鎖操作完成后的操作
示例:db.currentOp()
數據修復:數據庫自我修復的能力
示例:
use admin --選擇需要修復數據庫
db.repairDatabase()
4
.用戶管理
在啟動時需啟動安全檢查 --auth
a 添加用戶
use admin --選擇需要添加用戶的數據庫
db.addUser(
"root"
,
"passWord"
); --參數為用戶名和密碼
//其中admin數據庫中的用戶為管理員用戶
b 啟用用戶
db.auth(
"用戶名"
,
"密碼"
);
c 刪除用戶
db.system.users.remove({user:
"root"
}); --刪除用戶名為root的用戶
1.12
主從架構
a 主從復制————一個簡單的數據庫同步備份的集群技術
1.1
在數據集群中要明確的知道誰是主服務器,主服務器只有一臺
1.2
從服務器要知道自己的數據源,也就是對于主服務器是誰
1.3
--master用來確定主服務器
--slave和-source來控制從服務器
示例:
1
臺主服務器配置文件
dbpath=數據庫目錄
port=
8888
--端口
bind_ip=
127.0
.
0.1
--綁定IP地址
master=
true
--主服務器標識
1
臺從服務器配置文件
dbpath=數據庫目錄
port=
7777
--端口 可跟主服務器一樣也可不一樣,建議不一樣
source=
127.0
.
0.1
:
8888
--指向主服務器
slave=
true
--從服務器標識
1.4
主從復制的其他設置項
--only 指定復制某個數據庫,默認為全部數據庫 從服務器端設置
--slavedelay 設置主數據庫同步數據的延遲(單位為秒) 從服務器端設置
--fastsync 以主數據庫的節點快照為節點啟動從數據庫 從服務器端設置
--autoresync 如果不同步則重新同步數據庫 從服務器端設置
--oplogsize 設置oplog的大小(主節點操作記錄存儲在local的oplog中) 主服務器端設置
1.5
動態添加和刪除從節點
添加: db.sources.insert({
"host"
,
"192.168.1.100:9999"
}) --添加一個新的從節點
刪除: db.sources.remove({
"host"
,
"192.168.1.100:9999"
}) --刪除一個從節點
b 副本集————主從分布式
假設有個集群,三臺服務器,分別是ABC,其中A為主服務器,BC為從服務器
1
當A活躍時,BC用于備份
2
當A出現故障時,B變成活躍
3
當A再恢復后,此時AC變成備份服務器,B為主服務器
4
插入更新查詢操作只能在活躍節點上執行,備份節點只能備份
示例:
第一步:修改服務器配置文件
A服務器配置文件
dbpath=數據庫目錄
port=
1111
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
2222
--設定同伴
B服務器配置文件
dbpath=數據庫目錄
port=
2222
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
3333
--設定同伴
C服務器配置文件
dbpath=數據庫目錄
port=
3333
bind_ip=
127.0
.
0.1
replSet=child/
127.0
.
0.1
:
1111
--設定同伴
第二步:初始化副本集(在主服務器上設置)
use admin
db.runCommand({
"replSetInitiate"
:
{
"_id"
:
'child'
,
"members"
:[
{
"_id"
:
1
,
"host"
:
"127.0.0.1:1111"
},
{
"_id"
:
2
,
"host"
:
"127.0.0.1:2222"
},
{
"_id"
:
3
,
"host"
:
"127.0.0.1:3333"
}
]
}
})
第三步:查看副本集
rs.status()
節點參數:
standard 常規節點 參與投票 可能成為活躍節點
passive 副本節點 參與投票 不能成為活躍節點
arbiter 仲裁節點 參與投票 不能成為活躍節點
Priority 權重
0
~
1000
其中
0
表示副本節點,
1
~
1000
表示常規節點
arbiterOnly:
true
--表示仲裁節點
1.13
分片
1
.使用步驟(一臺配置服務器,一臺路由器,兩臺數據庫)
1.1
創建一個配置服務器
mongod --config 配置服務器.conf
1.2
創建路由服務器,并連接到配置服務器
路由器調用mongos命令
1.3
添加
2
個分片數據庫
8081
和
8082
1.4
利用路由器為集群添加分片(允許本地訪問)(在路由器服務器執行)
db.runCommand({addshard:
"127.0.0.1:8081"
,allowLocal:
true
})
db.runCommand({addshard:
"127.0.0.1:8082"
,allowLocal:
true
})
//其中數據庫之前不能使用任何數據庫語句
1.5
打開數據庫分片功能(在路由器服務器執行)
db.runCommand({
"enablesharding"
:
"數據庫名"
})
1.6
對集合進行分片
db.runCommand({
"shardcollection"
:
"數據庫名.集合名"
,
"key"
:{
"_id"
:
1
}})
1.7
查看集群中的所有分片
db.shards.find()
1.14
javaAPI
1
.導入jar包
2
.建立一個mongo的數據庫連接對象
Mongo mo =
new
Mongo(
"127.0.0.1:8888"
); 默認是
127.0
.
0.1
:
27017
3
.查詢所有的數據庫名字
mo.getDataBaseNames();
4
.創建相關數據庫的連接
DB db = mo.getDB(
"數據庫名"
);
5
.查詢數據庫所有的集合名字
db.getCollectionNames();
6
.創建相關集合連接
DBCollection c = db.getCollection(
"集合名"
);
7
.查詢集合所有數據
DBCursor cur = c.find();
//遍歷指針
while
(cur.hasNext()){
DBObject o = cur.next();
System.out.println(NameValue:
" + o.get("
name"));
//得到name字段值
}
8
.其他操作
cur.count();
//個數
JSON.serialize(cur);
//轉換Json對象
9
.新建集合操作
db.createCollection(
"集合名"
,
new
DBObject());
//如果沒有new DBObject()不操作集合退出的話,集合會從緩存中銷毀
10
.插入集合數據操作
DBObject doc =
new
BasicDBObject();
doc.put(
"name"
,
"test"
);
doc.put(
"age"
,
12
);
List<String> books =
new
ArrayList<String>();
books.add(
"MongoDB"
);
books.add(
"Java"
);
books.add(
"SQL"
);
doc.put(
"books"
,books);
c.insert(doc); --當傳入參數類型是list時則是批量插入
11
.刪除操作
c.remove(
new
BasicDBObject(
"_id"
,
new
ObjectId(id))) --根據Id刪除 因為集合中的ID是ObjectId類型
12
.更新操作
c.update(find,update,upsert,multi)
--find 查詢器
--update 更新器
--upsert 更新或者插入
true
/
false
--multi 是否批量
true
/
false
13
.分頁操作
c.find().limit(
5
).skip(
3
); 每頁
5
條,從第四條開始時(含第四條)
14
.排序操作
c.find.sort();
15
.關閉對象
c.close();
db.close();
轉載于http://www.CUOXin.com/ciade/
新聞熱點
疑難解答