1、建立數據庫
2、建立集合
db.persons.insert({name:"zhaomin",age:23})
3、查找
db.persons.
find()
db.persons.
findOne()
4、修改
db.persons.
update({name:"zhaomin"},{
$set:{age:18}})
#不會影響其餘屬性列 ,主鍵衝突會報錯
db.persons.
update({name:"zhaomin"},{
$set:{age:18}},true)
#第三個參數爲true 則執行insertOrUpdate操做,查詢出則更新,沒查出則插入,或者
var p = db.persons.
findOne();
db.persons.
update(p,{name:"zhaomin1"})
#會刪除其餘的屬性列
5、刪除
db.persons.
remove({age:1})
#刪除知足條件的第一條 只刪除數據 不刪除索引
#刪除集合
db.persons.
drop();
#刪除數據庫
db.
dropDatabase();
7、插入數據
db.persons.
insert()
#不容許鍵值重複
db.persons.
save()
#若鍵值重複,可改成插入操做
8、批量更新
db.persons.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true);
批量操做須要和選擇器同時使用,第一個false表示不執行
insertOrUpdate操做,第二個true表示執行批量
9、更新器使用
$set : 指定一個鍵值對,若存在就進行修改,不存在則添加
$inc :只使用於數字類型,能夠爲指定鍵值對的數字類型進行加減操做:
db.persons.update({name:"zhangsan"},{$inc:{age:2}})
執行結果是名字叫「zhangsan」的年齡加了2
$unset : 刪除指定的鍵
db.persons.update({name:"zhangsan"},{$unset:{age:1}})
$push : 數組鍵操做:一、若是存在指定的數組,則爲其添加值;二、若是不存在指定的數組,則建立數組鍵,並添加值;三、若是指定的鍵不爲數組類型,則報錯;
$pushAll : 批量想數組鍵插入值
db.persons.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}});
$addToSet : 當指定的數組中有這個值時,不插入,反之插入
db.persons.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #則不會添加到數組裏
$pop:刪除指定數組的值,當value=1 刪除最後一個值,當value=-1 刪除第一個值
db.persons.update({name:"zhangsan"},{$pop:{classes:1}}) #刪除了最後一個值
$pull : 刪除指定數組指定的值
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}}) #$pullAll批量刪除指定數組指定的值 指定必定是數組,不然會報錯
db.persons.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}}) #若數組中有多個Chinese,則全刪除
$ : 修改指定數組時,若數組有多個對象,但只想修改其中一些,則須要定位器:
db.persons.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}})
$addToSet 與
$each結合完成批量數組更新操做
db.persons.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}})
10、
runCommand函數和
findAndModify函數
runCommand({
findAndModify:"persons",
query:{查詢器},
sort:{排序},
update:{修改器},
new:true 是否返回修改後的數據
});
runCommand函數可執行mongdb中的特殊函數
findAndModify就是特殊函數之一,用於返回執行返回update或remove後的文檔
例如:
ps=db.
runCommand({
findAndModify:"persons",
query:{name:"zhangsan"},
update:{$set:{name:"lisi"}},
new:true
})
ps.value
11、查詢詳講
db.persons.find({},{_id:0,name:1})
第一個空括號表示查詢所有數據,第二個括號中值爲0表示不返回,值爲1表示返回,默認狀況下若不指定主鍵,主鍵老是會被返回;
db.persons.find({條件},{指定鍵});
比較操做符:
$lt: <
$lte: <=
$gt: >
$gte: >=
$ne: !=
一、查詢條件
db.persons.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1}) #查詢年齡大於等於25小於等於27的人
db.persons.find({country:{$ne:"韓國"}},{_id:0,name:1,country:1}) #查詢出全部國籍不是韓國的人的數學成績
二、包含與不包含(僅針對於數組)
$in 或
$nin
db.persons.find({country:{$in:["China","USA"]}},{_id:0,name:1:country:1}) #查詢國籍是中國或美國的學生信息
三、
$or查詢
db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1}) #查詢語文成績大於85或者英語大於90的學生信息
db.persons.update({country:"China"},{$set:{sex:"m"}},false,true) #把中國國籍的學生上增長新的鍵sex
db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1}) #查詢出sex爲null的人
四、正則表達式
db.persons.find({name:/li/i},{_id:0,name:1}) #查詢出名字中存在」li」的學生的信息
五、
$not的使用
$not和
$nin的區別是$not能夠用在任何地方兒$nin是用到集合上的
db.persons.find({name:{$not:/li/i}},{_id:0,name:1}) #查詢出名字中不存在」li」的學生的信息
六、
$all與index的使用
db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1}) #查詢喜歡看MONGOD和JS的學生
db.persons.find({"books.1":"JAVA"},{_id:0,name:1,books:1}) #查詢第二本書是JAVA的學習信息
七、
$size的使用,不能與比較查詢符同時使用
db.persons.find({books:{$size:4}},{_id:0,name:1}) #查詢出喜歡的書籍數量是4本的學生
八、查詢出喜歡的書籍數量大於4本的學生本的學生
1)增長size鍵
db.persons.update({},{$set:{size:4}},false,true)
2)添加書籍,同時更新size
db.persons.update({name:"jim"},{$push:{books:"ORACL"},$inc:{size:1}})
3)查詢大於3本的
db.persons.find({size:{$gt:4}},{_id:0,name:1,size:1})
九、
$slice操做符返回文檔中指定數組的內部值
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}}) #查詢出Jim書架中第2~4本書
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}}) #查詢出最後一本書
十、文檔查詢
查詢出在K上過學且成績爲A的學生
1)絕對查詢,順序和鍵個數要徹底符合
db.persons.find({school:{school:"K","score":"A"}},{_id:0,name:1})
2)對象方式,可是會出錯,多個條件可能會去多個對象查詢
db.persons.find({"school.school":"K","school.score":"A"},{_id:0,name:1})
3)正確作法單條條件組查詢$elemMatch
db.persons.
find({school:{
$elemMatch:{school:"K",score:"A"}},{_id:0,name:1})
db.persons.
find({age:{
$gt:22},books:"C++",school:"K"},{_id:0,name:1,age:1,books:1,school:1})
十一、分頁與排序
1)
limit返回指定條數 查詢出persons文檔中前5條數據:
db.persons.find({},{_id:0,name:1}).limit(5)
2)指定數據跨度 查詢出persons文檔中第3條數據後的5條數據
db.persons.find({},{_id:0,name:1}).limit(5).skip(3)
3)
sort排序 1爲正序,-1爲倒序
db.persons.find({},{_id:0,name:1,age:1}).limit(5).skip(3).sort({age:1})
注意:mongodb的key能夠存不一樣類型的數據排序就也有優先級
最小值->null->數字->字符串->對象/文檔->數組->二進制->對象ID->布爾->日期->時間戳->正則->最大值
十二、遊標
利用遊標遍歷查詢數據
var persons = db.persons.
find();
while(persons.
hasNext()){
obj = persons.
next();
print(obj.name)
}
遊標幾個銷燬條件
1).客戶端發來信息叫他銷燬
2).遊標迭代完畢
3).默認遊標超過10分鐘沒用也會別清除
1三、查詢快照
快照後就會針對不變的集合進行遊標運動了,看看使用方法.
db.persons.find({$query:{name:」Jim」},$snapshot:true}) #用快照則須要用高級查詢
高級查詢選項
1)
$query
2)
$orderby
3)
$maxsan:integer 最多掃描的文檔數
4)
$min:doc查詢開始
5)
$max:doc查詢結束
6)
$hint:doc使用哪一個索引
7)
$explain:boolean統計
8)
$snapshot:boolean 一致快照
12、索引
1.建立索引
db.books.ensureIndex{{number:1}}
建立索引同時指定索引的名字
db.books.ensureIndex({number:1},{name:"book_"})
2.索引使用須要注意的地方
1)建立索引的時候注意1是正序建立索引-1是倒序建立索引
2)索引的建立在提升查詢性能的同事會影響插入的性能 對於常常查詢少插入的文檔能夠考慮用索引
3)符合索引要注意索引的前後順序
4)每一個鍵全創建索引不必定就能提升性能呢 索引不是萬能的
5)在作排序工做的時候若是是超大數據量也能夠考慮加上索引 用來提升排序的性能
3.惟一索引
解決文檔books不能插入重複的數值
db.books.ensureIndex({name:-1},{unique:true}) #則插入相同的name值會報錯
4.踢出重複值
若是建議惟一索引以前已經有重複數值如何處理
db.books.ensureIndex({name:1},{name:"book_",unique:true,dropDups:true}) #踢出重複數值
5.後臺執行建立索引
爲了解決建立索引鎖表的問題,在不影響查詢功能,能夠在後臺運行
db.books.ensureIndex({name:1},{background:true})
6.強制查詢已經創建好的索引
db.books.find({name:"323book"}).hint({name:1}) #後一個name爲索引名,正序倒序依據創建索引的規則,不然會報錯
7.在shell查看數據庫已經創建的索引
db.system.
indexes.
find()
db.system.
namespaces.
find()
8.查詢索引信息和查詢狀態信息
db.books.find({name:"123book"}).explain()
9.批量和精確刪除索引
db.
runCommand({dropIndexes : "books" , index:"name_-1"})
db.
runCommand({dropIndexes : "books" , index:"*"})
十3、二維索引
創建二維索引
db.map.ensureIndex({gis:"2d"},{min:-1,max:201}) #默認會建一個[-108,108]的範圍
1.查詢點(70,180)最近的3個點
db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)
2.查詢以點(50,50)和點(190,190)爲對角線的正方形中的全部的點
db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})
3.查詢出以圓心爲(56,80)半徑爲50規則下的圓心面積中的點
db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1})
十4、Count+Distinct+Group
1.
count 查詢結果條數
db.persons.find({country:"USA"}).count()
2.
Distinct 去重
請查詢出persons中一共有多少個國家分別是什麼
db.runCommand({distinct:"persons",key:"country"}).values #key表示去重的鍵
3.
group分組
db.
runCommand({
group:{
ns:"集合的名字",
key:"分組鍵對象",
initial:"初始化累加器",
$reduce:"分解器",
condition:"條件",
finalize:"組完成器"
}})
分組首先會按照key進行分組,每組的 每個文檔全要執行$reduce的方法,他接收2個參數一個是組內本條記錄,一個是累加器數據.
請查出persons中每一個國家學生數學成績最好的學生信息(必須在90以上)
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.m;
prev.country = doc.country;
}
},
condition:{m:{
$gt:90}},
finalize:function(prev){
prev.m = prev.name+" comes from "+prev.country+" ,Math score is "+prev.m;
}
}
})
4.函數格式化分組鍵
若是集合中出現鍵
Counrty和
counTry同時存在
$keyf:
function(doc){
if(doc.country){
return {country:doc.country}
}
return {country:doc.counTry}
}
十5、經常使用命令舉例
1.查詢服務器版本號和主機操做系統
db.runCommand({buildInfo:1})
2查詢執行集合的詳細信息,大小,空間,索引等
db.runCommand({collStats:"persons"})
3查看操做本集合最後一次錯誤信息
db.runCommand({getLastError:"persons"})
十6、固定集合
1.特性
固定集合默認是沒有索引的就算是_id也是沒有索引的
因爲不需分配新的空間他的插入速度是很是快的
固定集合的順是肯定的致使查詢速度是很是快的
最適合就是日誌管理
2.建立固定集合
建立一個新的固定集合要求大小是100個字節,能夠存儲文檔10個
db.createCollection("mycoll",{size:100,capped:true,max:10})
把一個普通集合轉換成固定集合
db.runCommand({convertToCapped:"persons",size:1000})
3.對固定集合反向排序,默認狀況是插入的順序排序
db.mycoll.find().sort({$natural:-1})
十7、GridFS
GridFS是mongoDB自帶的文件系統他用二進制的形式存儲文件,大型文件系統的絕大可能是特性GridFS全能夠完成
使用
GridFS使用mongofiles.exe命令行
1.上傳文件
mongofiles -d foobar -l "E:\1.jpg" put "1.jpg"
2.查看文件內容
mongofiles -d foobar get "1.jpg"
3.查看全部文件
mongofiles -d foobar list
4.刪除已經存在的文件
mongofiles -d foobar delete '1.jpg'
十8、Eval
1.服務器端運行eval
db.eval("function(name){return name}","Jim")
2.javascript的存儲,在服務器上保存js全局變量
把變量加入到特殊集合system.js中
db.system.js.insert({_id:"uname",value:"Jim"})
db.eval("return uname") #用eval調用
System.js至關於Oracle中的存儲過程,由於value不僅僅能夠寫變量,還能夠寫函數體也就是javascript代碼
十9、啓動配置
1.利用config配置文件來啓動數據庫改變端口爲8888
mongodb.conf文件
dbpath = D:\sortware\mongod\db
port = 8888
啓動文件
cd C:\Users\thinkpad\Desktop\MONGODB\mongodb-win32-x86_64-2.0.6
bin\mongod.exe --config ../mongodb.conf
shell文件
mongo 127.0.0.1:8888
2.中止MongoDB服務
1)ctrl+c 組合鍵能夠關閉數據庫
2)admin數據庫命令關閉數據
use admin
db.
shutdownServer
3.導出數據(中斷其餘操做)
使用
mongoexport命令行
-d指明使用的庫
-c指明要導出的表
-o指明要導出的文件名
-csv指定導出的csv格式
-q過濾導出
--type<json|csv|tsv>
把數據好foobar中的persons導出
mongoexport -d foobar -c persons -o D:/persons.json
導出其餘主機數據庫的文檔
mongoexport --host 192.168.0.16 --port 37017
4.導入數據(中斷其餘操做)
mongoimport --db foobar --collections persons --file d:/persons.json
5.運行時備份
mongodump.exe
API: http://cn.docs.mongodb.org/manual/reference/mongodump
mongodump --host 127.0.0.1:27017 -d foobar -o d:/foobar
6.運行時恢復
mongorestore.exe
API:http://cn.docs.mongodb.org/manual/reference/mongorestore
恢復數據庫
db.
dropDatabase()
mongorestore --host 127.0.0.1:27017 -d foobar -directoryperdb d:/foobar/foobar
7.mongoDB是文件數據庫這其實就能夠用拷貝文件的方式進行備份
8.上鎖和解鎖
db.runCommand({fsync:1,lock:1}) #上鎖
db.currentOp() #解鎖
9.數據修復
當停電等不可逆轉災難來臨的時候,因爲mongodb的存儲結構致使
會產生垃圾數據,在數據恢復之後這垃圾數據依然存在,這是數據庫
提供一個自我修復的能力.使用起來很簡單
二10、用戶管理
1.添加用戶
爲admin添加uspcat用戶和foobar數據庫的yunfengcheng用戶
use foobar
db.
addUser("uspcat","123")
db.system.
users.find()
3.安全檢查
--auth
非foobar是不能操做數據庫的,啓用本身的用戶才能訪問
非admin數據庫的用戶不能使用數據庫命令,admin數據庫中的數據通過認證爲管理員用戶
4.用戶刪除操做
db.system.users.remove({user:"yunfengcheng"});
二11、主從複製
1.主數據庫配置:
dbpath = D:\mongodb\data\db\07\8888
#主數據庫地址
port = 8888
#主數據庫端口號
bind_ip = 127.0.0.1
#主數據庫所在服務器
master = true
#肯定我是主服務器
從數據庫配置:
dbpath = D:\mongodb\data\db\07\7777
#從數據庫地址
port = 7777
#從數據庫端口號
bind_ip = 127.0.0.1
#從數據庫所在服務器
source = 127.0.0.1:8888
#肯定從數據庫監聽端口
#這個配置項(source)能夠用shell動態添加
slave = true
#肯定本身是從服務器
2.主從複製的其餘設置項
--only 從節點?指定複製某個數據庫,默認是複製所有數據庫
--slavedelay 從節點?設置主數據庫同步數據的延遲(單位是秒)
--fastsync 從節點?以主數據庫的節點快照爲節點啓動從數據庫
--autoresync 從節點?若是不一樣步則重新同步數據庫
--oplogSize 主節點?設置oplog的大小(主節點操做記錄存儲到local的oplog中
3.利用shell動態添加和刪除從節點
咱們只要對集合進行操做就能夠動態操做主從關係
掛接主節點:操做以前只留下從數據庫服務
db.sources.insert({host:"127.0.0.1:8888"})
刪除已經掛接的主節點:操做以前只留下從數據庫服務
db.sources.remove({host:"127.0.0.1:8888"})
二12、副本集
A是活躍的B和C是用於備份的,當A出現了故障,這時候集羣根據權重算法推選出B爲活躍的數據庫,當A恢復後他自動又會變爲備份數據庫
1.設置conf文件
dbpath = D:\mongodb\data\db\07\1111
port = 1111
#端口
bind_ip = 127.0.0.1
#服務地址
2.初始化副本集
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"
}]
}
})
3.節點和初始化高級參數
standard :常規節點:參與投票有可能成爲活躍節點
passive :副本節點:參與投票,可是不能成爲活躍節點
arbiter :仲裁節點:只是參與投票不復制節點也不能成爲活躍節點
4.高級參數
Priority :0到1000之間 ,0表明是副本節點 ,1到1000是常規節點
arbiterOnly : true 仲裁節點
members":[{
"_id":1,
"host":"127.0.0.1:1111",
arbiterOnly : true
}]"
5.讀寫分離
通常狀況下做爲副本的節點是不能進行數據庫讀操做的,可是在讀取密集型的系統中讀寫分離是十分必要的
設置讀寫分離
slaveOkay : true
二十3、分片
1.分片步驟
1)建立一個配置服務器
shardServer.conf
dbpath=D:\mongodb\data\db\08\conf
port=2000
bind_ip=127.0.0.1
shardServer.bat
mongod --conf shardServer.conf
2)建立路由服務器
mongos --port 1000 --configdb 127.0.0.1:2000
shell文件: mongo 127.0.0.1:1000/admin
3)添加2個分片數據庫 8081和8082
shard8081.conf
dbpath=D:\mongodb\data\db\08\8081
port=8081
bind_ip=127.0.0.1
shard8081.bat
mongos --conf shard8081.conf
shard8081Shell.bat
mongo 127.0.0.1:8081/admin
4)啓動四個數據庫服務器
打開路由shell命令行,爲集羣添加分片(容許本地訪問)"切記以前不能使用任何數據庫語句"
db.
runCommand({addshard:"127.0.0.1:8081",allowLocal:true})
db.
runCommand({addshard:"127.0.0.1:8082",allowLocal:true})
5)指定打開分片功能的數據庫
db.runCommand({enablesharding:"foobar"})
6)指定集合進行分片,並設置片鍵
db.runCommand({shardcollection:"foobar.persons",key:{_id:1}})
7)插入大數據量進行測試
進入分片8081查詢數據條數
db.persons.find().count()
3.查看集羣對persons的自動分片機制配置信息
mongos> db.shards.
find()
{ "_id" : "shard0000", "host" : "127.0.0.1:8081" }
{ "_id" : "shard0001", "host" : "127.0.0.1:8082" }