mongon命令(转)
生活随笔
收集整理的這篇文章主要介紹了
mongon命令(转)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文:http://www.cnblogs.com/blueness-sunshine/p/6139092.html 連接mongodb: mongo -umir -p123456 --authenticationDatabase mir2
db.persons.find() db.persons.findOne() 四、修改
db.persons.update({name:"zhaomin"},{$set:{age:18}})?#不會(huì)影響其他屬性列 ,主鍵沖突會(huì)報(bào)錯(cuò) db.persons.update({name:"zhaomin"},{$set:{age:18}},true)#第三個(gè)參數(shù)為true 則執(zhí)行insertOrUpdate操作,查詢出則更新,沒(méi)查出則插入,或者 var p = db.persons.findOne(); db.persons.update(p,{name:"zhaomin1"})?#會(huì)刪除其他的屬性列 五、刪除
db.persons.remove({age:1})?#刪除滿足條件的第一條 只刪除數(shù)據(jù) 不刪除索引 #刪除集合 db.persons.drop(); #刪除數(shù)據(jù)庫(kù) db.dropDatabase(); 六、查看集合
show collections 查看數(shù)據(jù)庫(kù)
show dbs 七、插入數(shù)據(jù)
db.persons.insert()?#不允許鍵值重復(fù) db.persons.save()?#若鍵值重復(fù),可改為插入操作 八、批量更新
db.persons.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true); 批量操作需要和選擇器同時(shí)使用,第一個(gè)false表示不執(zhí)行insertOrUpdate操作,第二個(gè)true表示執(zhí)行批量 九、更新器使用$set?: 指定一個(gè)鍵值對(duì),若存在就進(jìn)行修改,不存在則添加 $inc?:只使用于數(shù)字類(lèi)型,可以為指定鍵值對(duì)的數(shù)字類(lèi)型進(jìn)行加減操作:
db.persons.update({name:"zhangsan"},{$inc:{age:2}}) 執(zhí)行結(jié)果是名字叫“zhangsan”的年齡加了2 $unset?: 刪除指定的鍵?
db.persons.update({name:"zhangsan"},{$unset:{age:1}}) $push?: 數(shù)組鍵操作:1、如果存在指定的數(shù)組,則為其添加值;2、如果不存在指定的數(shù)組,則創(chuàng)建數(shù)組鍵,并添加值;3、如果指定的鍵不為數(shù)組類(lèi)型,則報(bào)錯(cuò); $pushAll?: 批量想數(shù)組鍵插入值
db.persons.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}}); $addToSet?: 當(dāng)指定的數(shù)組中有這個(gè)值時(shí),不插入,反之插入
db.persons.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #則不會(huì)添加到數(shù)組里 $pop:刪除指定數(shù)組的值,當(dāng)value=1 刪除最后一個(gè)值,當(dāng)value=-1 刪除第一個(gè)值
db.persons.update({name:"zhangsan"},{$pop:{classes:1}}) #刪除了最后一個(gè)值 $pull?: 刪除指定數(shù)組指定的值
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}}) #$pullAll批量刪除指定數(shù)組指定的值 指定一定是數(shù)組,否則會(huì)報(bào)錯(cuò) db.persons.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}}) #若數(shù)組中有多個(gè)Chinese,則全刪除 $?: 修改指定數(shù)組時(shí),若數(shù)組有多個(gè)對(duì)象,但只想修改其中一些,則需要定位器:
db.persons.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}}) $addToSet?與?$each結(jié)合完成批量數(shù)組更新操作
db.persons.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}}) 十、runCommand函數(shù)和findAndModify函數(shù)
runCommand({ findAndModify:"persons", query:{查詢器}, sort:{排序}, update:{修改器}, new:true 是否返回修改后的數(shù)據(jù) }); runCommand函數(shù)可執(zhí)行mongdb中的特殊函數(shù) findAndModify就是特殊函數(shù)之一,用于返回執(zhí)行返回update或remove后的文檔 例如:
ps=db.runCommand({ findAndModify:"persons", query:{name:"zhangsan"}, update:{$set:{name:"lisi"}}, new:true }) ps.value 十一、查詢?cè)斨v
db.persons.find({},{_id:0,name:1}) 第一個(gè)空括號(hào)表示查詢?nèi)繑?shù)據(jù),第二個(gè)括號(hào)中值為0表示不返回,值為1表示返回,默認(rèn)情況下若不指定主鍵,主鍵總是會(huì)被返回; db.persons.find({條件},{指定鍵}); 比較操作符:$lt: <?$lte: <=?$gt: >?$gte: >=?$ne: != 1、查詢條件
db.persons.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1}) #查詢年齡大于等于25小于等于27的人?
db.persons.find({country:{$ne:"韓國(guó)"}},{_id:0,name:1,country:1}) #查詢出所有國(guó)籍不是韓國(guó)的人的數(shù)學(xué)成績(jī)? 2、包含與不包含(僅針對(duì)于數(shù)組) $in?或?$nin
db.persons.find({country:{$in:["China","USA"]}},{_id:0,name:1:country:1}) #查詢國(guó)籍是中國(guó)或美國(guó)的學(xué)生信息? 3、$or查詢 db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1}) #查詢語(yǔ)文成績(jī)大于85或者英語(yǔ)大于90的學(xué)生信息
db.persons.update({country:"China"},{$set:{sex:"m"}},false,true) #把中國(guó)國(guó)籍的學(xué)生上增加新的鍵sex?
db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1}) #查詢出sex為null的人? 4、正則表達(dá)式
db.persons.find({name:/li/i},{_id:0,name:1}) #查詢出名字中存在”li”的學(xué)生的信息 5、$not的使用 $not和$nin的區(qū)別是$not可以用在任何地方兒$nin是用到集合上的
db.persons.find({name:{$not:/li/i}},{_id:0,name:1}) #查詢出名字中不存在”li”的學(xué)生的信息 6、$all與index的使用
db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1}) #查詢喜歡看MONGOD和JS的學(xué)生
db.persons.find({"books.1":"JAVA"},{_id:0,name:1,books:1}) #查詢第二本書(shū)是JAVA的學(xué)習(xí)信息 7、$size的使用,不能與比較查詢符同時(shí)使用
db.persons.find({books:{$size:4}},{_id:0,name:1}) #查詢出喜歡的書(shū)籍?dāng)?shù)量是4本的學(xué)生 8、查詢出喜歡的書(shū)籍?dāng)?shù)量大于4本的學(xué)生本的學(xué)生 1)增加size鍵
db.persons.update({},{$set:{size:4}},false,true) 2)添加書(shū)籍,同時(shí)更新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}) 9、$slice操作符返回文檔中指定數(shù)組的內(nèi)部值
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}}) #查詢出Jim書(shū)架中第2~4本書(shū)
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}}) #查詢出最后一本書(shū) 10、文檔查詢 查詢出在K上過(guò)學(xué)且成績(jī)?yōu)锳的學(xué)生 1)絕對(duì)查詢,順序和鍵個(gè)數(shù)要完全符合
db.persons.find({school:{school:"K","score":"A"}},{_id:0,name:1}) 2)對(duì)象方式,但是會(huì)出錯(cuò),多個(gè)條件可能會(huì)去多個(gè)對(duì)象查詢
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}) 11、分頁(yè)與排序 1)limit返回指定條數(shù) 查詢出persons文檔中前5條數(shù)據(jù):
db.persons.find({},{_id:0,name:1}).limit(5) 2)指定數(shù)據(jù)跨度 查詢出persons文檔中第3條數(shù)據(jù)后的5條數(shù)據(jù)
?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可以存不同類(lèi)型的數(shù)據(jù)排序就也有優(yōu)先級(jí) 最小值->null->數(shù)字->字符串->對(duì)象/文檔->數(shù)組->二進(jìn)制->對(duì)象ID->布爾->日期->時(shí)間戳->正則->最大值 12、游標(biāo) 利用游標(biāo)遍歷查詢數(shù)據(jù)
var?persons = db.persons.find(); while(persons.hasNext()){ obj = persons.next(); print(obj.name) } 游標(biāo)幾個(gè)銷(xiāo)毀條件 1).客戶端發(fā)來(lái)信息叫他銷(xiāo)毀 2).游標(biāo)迭代完畢 3).默認(rèn)游標(biāo)超過(guò)10分鐘沒(méi)用也會(huì)別清除 13、查詢快照 快照后就會(huì)針對(duì)不變的集合進(jìn)行游標(biāo)運(yùn)動(dòng)了,看看使用方法.?
db.persons.find({$query:{name:”Jim”},$snapshot:true}) #用快照則需要用高級(jí)查詢 高級(jí)查詢選項(xiàng) 1)$query 2)$orderby 3)$maxsan:integer 最多掃描的文檔數(shù) 4)$min:doc查詢開(kāi)始 5)$max:doc查詢結(jié)束 6)$hint:doc使用哪個(gè)索引 7)$explain:boolean統(tǒng)計(jì) 8)$snapshot:boolean 一致快照 十二、索引 1.創(chuàng)建索引
db.books.ensureIndex{{number:1}} 創(chuàng)建索引同時(shí)指定索引的名字
db.books.ensureIndex({number:1},{name:"book_"}) 2.索引使用需要注意的地方 1)創(chuàng)建索引的時(shí)候注意1是正序創(chuàng)建索引-1是倒序創(chuàng)建索引 2)索引的創(chuàng)建在提高查詢性能的同事會(huì)影響插入的性能 對(duì)于經(jīng)常查詢少插入的文檔可以考慮用索引 3)符合索引要注意索引的先后順序 4)每個(gè)鍵全建立索引不一定就能提高性能呢 索引不是萬(wàn)能的 5)在做排序工作的時(shí)候如果是超大數(shù)據(jù)量也可以考慮加上索引 用來(lái)提高排序的性能 3.唯一索引 解決文檔books不能插入重復(fù)的數(shù)值
db.books.ensureIndex({name:-1},{unique:true}) #則插入相同的name值會(huì)報(bào)錯(cuò) 4.踢出重復(fù)值 如果建議唯一索引之前已經(jīng)有重復(fù)數(shù)值如何處理 db.books.ensureIndex({name:1},{name:"book_",unique:true,dropDups:true}) #踢出重復(fù)數(shù)值 5.后臺(tái)執(zhí)行創(chuàng)建索引 為了解決創(chuàng)建索引鎖表的問(wèn)題,在不影響查詢功能,可以在后臺(tái)運(yùn)行
db.books.ensureIndex({name:1},{background:true}) 6.強(qiáng)制查詢已經(jīng)建立好的索引
db.books.find({name:"323book"}).hint({name:1}) #后一個(gè)name為索引名,正序倒序依據(jù)建立索引的規(guī)則,否則會(huì)報(bào)錯(cuò) 7.在shell查看數(shù)據(jù)庫(kù)已經(jīng)建立的索引
db.system.indexes.find() db.system.namespaces.find() 8.查詢索引信息和查詢狀態(tài)信息
db.books.find({name:"123book"}).explain() 9.批量和精確刪除索引
db.runCommand({dropIndexes : "books" , index:"name_-1"}) db.runCommand({dropIndexes : "books" , index:"*"}) 十三、二維索引 建立二維索引
db.map.ensureIndex({gis:"2d"},{min:-1,max:201}) #默認(rèn)會(huì)建一個(gè)[-108,108]的范圍 1.查詢點(diǎn)(70,180)最近的3個(gè)點(diǎn)
db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3) 2.查詢以點(diǎn)(50,50)和點(diǎn)(190,190)為對(duì)角線的正方形中的所有的點(diǎn)
db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1}) 3.查詢出以圓心為(56,80)半徑為50規(guī)則下的圓心面積中的點(diǎn)
db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1}) 十四、Count+Distinct+Group 1.count?查詢結(jié)果條數(shù)
db.persons.find({country:"USA"}).count() 2.Distinct?去重 請(qǐng)查詢出persons中一共有多少個(gè)國(guó)家分別是什么
db.runCommand({distinct:"persons",key:"country"}).values #key表示去重的鍵 3.group分組
db.runCommand({?group:{ ns:"集合的名字", key:"分組鍵對(duì)象", initial:"初始化累加器", $reduce:"分解器", condition:"條件", finalize:"組完成器" }}) 分組首先會(huì)按照key進(jìn)行分組,每組的 每一個(gè)文檔全要執(zhí)行$reduce的方法,他接收2個(gè)參數(shù)一個(gè)是組內(nèi)本條記錄,一個(gè)是累加器數(shù)據(jù). 請(qǐng)查出persons中每個(gè)國(guó)家學(xué)生數(shù)學(xué)成績(jī)最好的學(xué)生信息(必須在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.函數(shù)格式化分組鍵 如果集合中出現(xiàn)鍵Counrty和counTry同時(shí)存在
$keyf:function(doc){ if(doc.country){ return?{country:doc.country} } return?{country:doc.counTry} } 十五、常用命令舉例 1.查詢服務(wù)器版本號(hào)和主機(jī)操作系統(tǒng)
db.runCommand({buildInfo:1}) 2查詢執(zhí)行集合的詳細(xì)信息,大小,空間,索引等
db.runCommand({collStats:"persons"}) 3查看操作本集合最后一次錯(cuò)誤信息
db.runCommand({getLastError:"persons"}) 十六、固定集合 1.特性 固定集合默認(rèn)是沒(méi)有索引的就算是_id也是沒(méi)有索引的 由于不需分配新的空間他的插入速度是非常快的 固定集合的順是確定的導(dǎo)致查詢速度是非常快的 最適合就是日志管理 2.創(chuàng)建固定集合 創(chuàng)建一個(gè)新的固定集合要求大小是100個(gè)字節(jié),可以存儲(chǔ)文檔10個(gè)
db.createCollection("mycoll",{size:100,capped:true,max:10}) 把一個(gè)普通集合轉(zhuǎn)換成固定集合
db.runCommand({convertToCapped:"persons",size:1000}) 3.對(duì)固定集合反向排序,默認(rèn)情況是插入的順序排序
db.mycoll.find().sort({$natural:-1}) 十七、GridFS GridFS是mongoDB自帶的文件系統(tǒng)他用二進(jìn)制的形式存儲(chǔ)文件,大型文件系統(tǒng)的絕大多是特性GridFS全可以完成 使用GridFS使用mongofiles.exe命令行 1.上傳文件
mongofiles -d foobar -l "E:\1.jpg" put "1.jpg" 2.查看文件內(nèi)容
mongofiles -d foobar get "1.jpg" 3.查看所有文件
mongofiles -d foobar list 4.刪除已經(jīng)存在的文件
mongofiles -d foobar delete '1.jpg' 十八、Eval 1.服務(wù)器端運(yùn)行eval
db.eval("function(name){return name}","Jim") 2.javascript的存儲(chǔ),在服務(wù)器上保存js全局變量 把變量加入到特殊集合system.js中
db.system.js.insert({_id:"uname",value:"Jim"})
db.eval("return uname") #用eval調(diào)用 System.js相當(dāng)于Oracle中的存儲(chǔ)過(guò)程,因?yàn)関alue不單單可以寫(xiě)變量,還可以寫(xiě)函數(shù)體也就是javascript代碼 十九、啟動(dòng)配置 1.利用config配置文件來(lái)啟動(dòng)數(shù)據(jù)庫(kù)改變端口為8888 mongodb.conf文件 dbpath = D:\sortware\mongod\db port = 8888 啟動(dòng)文件 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服務(wù) 1)ctrl+c 組合鍵可以關(guān)閉數(shù)據(jù)庫(kù) 2)admin數(shù)據(jù)庫(kù)命令關(guān)閉數(shù)據(jù) use?admin db.shutdownServer 3.導(dǎo)出數(shù)據(jù)(中斷其他操作) 使用mongoexport命令行 -d指明使用的庫(kù) -c指明要導(dǎo)出的表 -o指明要導(dǎo)出的文件名 -csv指定導(dǎo)出的csv格式 -q過(guò)濾導(dǎo)出 --type<json|csv|tsv> 把數(shù)據(jù)好foobar中的persons導(dǎo)出
mongoexport?-d foobar -c persons -o D:/persons.json 導(dǎo)出其他主機(jī)數(shù)據(jù)庫(kù)的文檔
mongoexport?--host 192.168.0.16 --port 37017 4.導(dǎo)入數(shù)據(jù)(中斷其他操作) mongoimport?--db foobar --collections persons --file d:/persons.json 5.運(yùn)行時(shí)備份?mongodump.exe API: http://cn.docs.mongodb.org/manual/reference/mongodump mongodump?--host 127.0.0.1:27017 -d foobar -o d:/foobar 6.運(yùn)行時(shí)恢復(fù)?mongorestore.exe API:http://cn.docs.mongodb.org/manual/reference/mongorestore 恢復(fù)數(shù)據(jù)庫(kù) db.dropDatabase() mongorestore?--host 127.0.0.1:27017 -d foobar -directoryperdb d:/foobar/foobar 7.mongoDB是文件數(shù)據(jù)庫(kù)這其實(shí)就可以用拷貝文件的方式進(jìn)行備份 8.上鎖和解鎖
db.runCommand({fsync:1,lock:1}) #上鎖
db.currentOp() #解鎖 9.數(shù)據(jù)修復(fù) 當(dāng)停電等不可逆轉(zhuǎn)災(zāi)難來(lái)臨的時(shí)候,由于mongodb的存儲(chǔ)結(jié)構(gòu)導(dǎo)致 會(huì)產(chǎn)生垃圾數(shù)據(jù),在數(shù)據(jù)恢復(fù)以后這垃圾數(shù)據(jù)依然存在,這是數(shù)據(jù)庫(kù) 提供一個(gè)自我修復(fù)的能力.使用起來(lái)很簡(jiǎn)單 db.repairDatabase() 二十、用戶管理 1.添加用戶 為admin添加uspcat用戶和foobar數(shù)據(jù)庫(kù)的yunfengcheng用戶
use?foobar db.addUser("uspcat","123") db.system.users.find() 2.啟用用戶
db.auth("名稱","密碼") 3.安全檢查?--auth 非foobar是不能操作數(shù)據(jù)庫(kù)的,啟用自己的用戶才能訪問(wèn) 非admin數(shù)據(jù)庫(kù)的用戶不能使用數(shù)據(jù)庫(kù)命令,admin數(shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)過(guò)認(rèn)證為管理員用戶 4.用戶刪除操作
db.system.users.remove({user:"yunfengcheng"}); 二十一、主從復(fù)制 1.主數(shù)據(jù)庫(kù)配置:
dbpath = D:\mongodb\data\db\07\8888?#主數(shù)據(jù)庫(kù)地址 port = 8888?#主數(shù)據(jù)庫(kù)端口號(hào) bind_ip = 127.0.0.1?#主數(shù)據(jù)庫(kù)所在服務(wù)器 master = true?#確定我是主服務(wù)器 從數(shù)據(jù)庫(kù)配置:
dbpath = D:\mongodb\data\db\07\7777?#從數(shù)據(jù)庫(kù)地址 port = 7777?#從數(shù)據(jù)庫(kù)端口號(hào) bind_ip = 127.0.0.1?#從數(shù)據(jù)庫(kù)所在服務(wù)器 source = 127.0.0.1:8888?#確定從數(shù)據(jù)庫(kù)監(jiān)聽(tīng)端口 #這個(gè)配置項(xiàng)(source)可以用shell動(dòng)態(tài)添加 slave = true?#確定自己是從服務(wù)器 2.主從復(fù)制的其他設(shè)置項(xiàng) --only?從節(jié)點(diǎn)?指定復(fù)制某個(gè)數(shù)據(jù)庫(kù),默認(rèn)是復(fù)制全部數(shù)據(jù)庫(kù) --slavedelay?從節(jié)點(diǎn)?設(shè)置主數(shù)據(jù)庫(kù)同步數(shù)據(jù)的延遲(單位是秒) --fastsync?從節(jié)點(diǎn)?以主數(shù)據(jù)庫(kù)的節(jié)點(diǎn)快照為節(jié)點(diǎn)啟動(dòng)從數(shù)據(jù)庫(kù) --autoresync?從節(jié)點(diǎn)?如果不同步則從新同步數(shù)據(jù)庫(kù) --oplogSize?主節(jié)點(diǎn)?設(shè)置oplog的大小(主節(jié)點(diǎn)操作記錄存儲(chǔ)到local的oplog中 3.利用shell動(dòng)態(tài)添加和刪除從節(jié)點(diǎn) 我們只要對(duì)集合進(jìn)行操作就可以動(dòng)態(tài)操作主從關(guān)系 掛接主節(jié)點(diǎn):操作之前只留下從數(shù)據(jù)庫(kù)服務(wù)
db.sources.insert({host:"127.0.0.1:8888"}) 刪除已經(jīng)掛接的主節(jié)點(diǎn):操作之前只留下從數(shù)據(jù)庫(kù)服務(wù)
db.sources.remove({host:"127.0.0.1:8888"}) 二十二、副本集 A是活躍的B和C是用于備份的,當(dāng)A出現(xiàn)了故障,這時(shí)候集群根據(jù)權(quán)重算法推選出B為活躍的數(shù)據(jù)庫(kù),當(dāng)A恢復(fù)后他自動(dòng)又會(huì)變?yōu)閭浞輸?shù)據(jù)庫(kù) 1.設(shè)置conf文件
dbpath = D:\mongodb\data\db\07\1111 port = 1111?#端口 bind_ip = 127.0.0.1?#服務(wù)地址 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" }] } }) 查看副本集狀態(tài):
rs.status() 3.節(jié)點(diǎn)和初始化高級(jí)參數(shù) standard?:常規(guī)節(jié)點(diǎn):參與投票有可能成為活躍節(jié)點(diǎn) passive?:副本節(jié)點(diǎn):參與投票,但是不能成為活躍節(jié)點(diǎn) arbiter?:仲裁節(jié)點(diǎn):只是參與投票不復(fù)制節(jié)點(diǎn)也不能成為活躍節(jié)點(diǎn) 4.高級(jí)參數(shù) Priority?:0到1000之間 ,0代表是副本節(jié)點(diǎn) ,1到1000是常規(guī)節(jié)點(diǎn) arbiterOnly?: true 仲裁節(jié)點(diǎn) members":[{ "_id":1, "host":"127.0.0.1:1111", arbiterOnly : true }]" 5.讀寫(xiě)分離 一般情況下作為副本的節(jié)點(diǎn)是不能進(jìn)行數(shù)據(jù)庫(kù)讀操作的,但是在讀取密集型的系統(tǒng)中讀寫(xiě)分離是十分必要的 設(shè)置讀寫(xiě)分離slaveOkay?: true 二十三、分片 1.分片步驟 1)創(chuàng)建一個(gè)配置服務(wù)器
shardServer.conf dbpath=D:\mongodb\data\db\08\conf port=2000 bind_ip=127.0.0.1 shardServer.bat mongod --conf shardServer.conf 2)創(chuàng)建路由服務(wù)器
mongos --port 1000 --configdb 127.0.0.1:2000 shell文件: mongo 127.0.0.1:1000/admin 3)添加2個(gè)分片數(shù)據(jù)庫(kù) 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)啟動(dòng)四個(gè)數(shù)據(jù)庫(kù)服務(wù)器 打開(kāi)路由shell命令行,為集群添加分片(允許本地訪問(wèn))"切記之前不能使用任何數(shù)據(jù)庫(kù)語(yǔ)句"
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true}) db.runCommand({addshard:"127.0.0.1:8082",allowLocal:true}) 5)指定打開(kāi)分片功能的數(shù)據(jù)庫(kù)
db.runCommand({enablesharding:"foobar"}) 6)指定集合進(jìn)行分片,并設(shè)置片鍵
db.runCommand({shardcollection:"foobar.persons",key:{_id:1}}) 7)插入大數(shù)據(jù)量進(jìn)行測(cè)試 進(jìn)入分片8081查詢數(shù)據(jù)條數(shù)
db.persons.find().count() 2.查看配置庫(kù)對(duì)于分片配置存儲(chǔ)信息
db.printShardingStatus() 3.查看集群對(duì)persons的自動(dòng)分片機(jī)制配置信息
mongos> db.shards.find() { "_id" : "shard0000", "host" : "127.0.0.1:8081" } { "_id" : "shard0001", "host" : "127.0.0.1:8082" }
?
一、創(chuàng)建數(shù)據(jù)庫(kù) use foobar 二、創(chuàng)建集合 db.persons.insert({name:"zhaomin",age:23}) 三、查找db.persons.find() db.persons.findOne() 四、修改
db.persons.update({name:"zhaomin"},{$set:{age:18}})?#不會(huì)影響其他屬性列 ,主鍵沖突會(huì)報(bào)錯(cuò) db.persons.update({name:"zhaomin"},{$set:{age:18}},true)#第三個(gè)參數(shù)為true 則執(zhí)行insertOrUpdate操作,查詢出則更新,沒(méi)查出則插入,或者 var p = db.persons.findOne(); db.persons.update(p,{name:"zhaomin1"})?#會(huì)刪除其他的屬性列 五、刪除
db.persons.remove({age:1})?#刪除滿足條件的第一條 只刪除數(shù)據(jù) 不刪除索引 #刪除集合 db.persons.drop(); #刪除數(shù)據(jù)庫(kù) db.dropDatabase(); 六、查看集合
show collections 查看數(shù)據(jù)庫(kù)
show dbs 七、插入數(shù)據(jù)
db.persons.insert()?#不允許鍵值重復(fù) db.persons.save()?#若鍵值重復(fù),可改為插入操作 八、批量更新
db.persons.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true); 批量操作需要和選擇器同時(shí)使用,第一個(gè)false表示不執(zhí)行insertOrUpdate操作,第二個(gè)true表示執(zhí)行批量 九、更新器使用$set?: 指定一個(gè)鍵值對(duì),若存在就進(jìn)行修改,不存在則添加 $inc?:只使用于數(shù)字類(lèi)型,可以為指定鍵值對(duì)的數(shù)字類(lèi)型進(jìn)行加減操作:
db.persons.update({name:"zhangsan"},{$inc:{age:2}}) 執(zhí)行結(jié)果是名字叫“zhangsan”的年齡加了2 $unset?: 刪除指定的鍵?
db.persons.update({name:"zhangsan"},{$unset:{age:1}}) $push?: 數(shù)組鍵操作:1、如果存在指定的數(shù)組,則為其添加值;2、如果不存在指定的數(shù)組,則創(chuàng)建數(shù)組鍵,并添加值;3、如果指定的鍵不為數(shù)組類(lèi)型,則報(bào)錯(cuò); $pushAll?: 批量想數(shù)組鍵插入值
db.persons.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}}); $addToSet?: 當(dāng)指定的數(shù)組中有這個(gè)值時(shí),不插入,反之插入
db.persons.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #則不會(huì)添加到數(shù)組里 $pop:刪除指定數(shù)組的值,當(dāng)value=1 刪除最后一個(gè)值,當(dāng)value=-1 刪除第一個(gè)值
db.persons.update({name:"zhangsan"},{$pop:{classes:1}}) #刪除了最后一個(gè)值 $pull?: 刪除指定數(shù)組指定的值
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}}) #$pullAll批量刪除指定數(shù)組指定的值 指定一定是數(shù)組,否則會(huì)報(bào)錯(cuò) db.persons.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}}) #若數(shù)組中有多個(gè)Chinese,則全刪除 $?: 修改指定數(shù)組時(shí),若數(shù)組有多個(gè)對(duì)象,但只想修改其中一些,則需要定位器:
db.persons.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}}) $addToSet?與?$each結(jié)合完成批量數(shù)組更新操作
db.persons.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}}) 十、runCommand函數(shù)和findAndModify函數(shù)
runCommand({ findAndModify:"persons", query:{查詢器}, sort:{排序}, update:{修改器}, new:true 是否返回修改后的數(shù)據(jù) }); runCommand函數(shù)可執(zhí)行mongdb中的特殊函數(shù) findAndModify就是特殊函數(shù)之一,用于返回執(zhí)行返回update或remove后的文檔 例如:
ps=db.runCommand({ findAndModify:"persons", query:{name:"zhangsan"}, update:{$set:{name:"lisi"}}, new:true }) ps.value 十一、查詢?cè)斨v
db.persons.find({},{_id:0,name:1}) 第一個(gè)空括號(hào)表示查詢?nèi)繑?shù)據(jù),第二個(gè)括號(hào)中值為0表示不返回,值為1表示返回,默認(rèn)情況下若不指定主鍵,主鍵總是會(huì)被返回; db.persons.find({條件},{指定鍵}); 比較操作符:$lt: <?$lte: <=?$gt: >?$gte: >=?$ne: != 1、查詢條件
db.persons.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1}) #查詢年齡大于等于25小于等于27的人?
db.persons.find({country:{$ne:"韓國(guó)"}},{_id:0,name:1,country:1}) #查詢出所有國(guó)籍不是韓國(guó)的人的數(shù)學(xué)成績(jī)? 2、包含與不包含(僅針對(duì)于數(shù)組) $in?或?$nin
db.persons.find({country:{$in:["China","USA"]}},{_id:0,name:1:country:1}) #查詢國(guó)籍是中國(guó)或美國(guó)的學(xué)生信息? 3、$or查詢 db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1}) #查詢語(yǔ)文成績(jī)大于85或者英語(yǔ)大于90的學(xué)生信息
db.persons.update({country:"China"},{$set:{sex:"m"}},false,true) #把中國(guó)國(guó)籍的學(xué)生上增加新的鍵sex?
db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1}) #查詢出sex為null的人? 4、正則表達(dá)式
db.persons.find({name:/li/i},{_id:0,name:1}) #查詢出名字中存在”li”的學(xué)生的信息 5、$not的使用 $not和$nin的區(qū)別是$not可以用在任何地方兒$nin是用到集合上的
db.persons.find({name:{$not:/li/i}},{_id:0,name:1}) #查詢出名字中不存在”li”的學(xué)生的信息 6、$all與index的使用
db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1}) #查詢喜歡看MONGOD和JS的學(xué)生
db.persons.find({"books.1":"JAVA"},{_id:0,name:1,books:1}) #查詢第二本書(shū)是JAVA的學(xué)習(xí)信息 7、$size的使用,不能與比較查詢符同時(shí)使用
db.persons.find({books:{$size:4}},{_id:0,name:1}) #查詢出喜歡的書(shū)籍?dāng)?shù)量是4本的學(xué)生 8、查詢出喜歡的書(shū)籍?dāng)?shù)量大于4本的學(xué)生本的學(xué)生 1)增加size鍵
db.persons.update({},{$set:{size:4}},false,true) 2)添加書(shū)籍,同時(shí)更新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}) 9、$slice操作符返回文檔中指定數(shù)組的內(nèi)部值
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}}) #查詢出Jim書(shū)架中第2~4本書(shū)
db.persons.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}}) #查詢出最后一本書(shū) 10、文檔查詢 查詢出在K上過(guò)學(xué)且成績(jī)?yōu)锳的學(xué)生 1)絕對(duì)查詢,順序和鍵個(gè)數(shù)要完全符合
db.persons.find({school:{school:"K","score":"A"}},{_id:0,name:1}) 2)對(duì)象方式,但是會(huì)出錯(cuò),多個(gè)條件可能會(huì)去多個(gè)對(duì)象查詢
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}) 11、分頁(yè)與排序 1)limit返回指定條數(shù) 查詢出persons文檔中前5條數(shù)據(jù):
db.persons.find({},{_id:0,name:1}).limit(5) 2)指定數(shù)據(jù)跨度 查詢出persons文檔中第3條數(shù)據(jù)后的5條數(shù)據(jù)
?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可以存不同類(lèi)型的數(shù)據(jù)排序就也有優(yōu)先級(jí) 最小值->null->數(shù)字->字符串->對(duì)象/文檔->數(shù)組->二進(jìn)制->對(duì)象ID->布爾->日期->時(shí)間戳->正則->最大值 12、游標(biāo) 利用游標(biāo)遍歷查詢數(shù)據(jù)
var?persons = db.persons.find(); while(persons.hasNext()){ obj = persons.next(); print(obj.name) } 游標(biāo)幾個(gè)銷(xiāo)毀條件 1).客戶端發(fā)來(lái)信息叫他銷(xiāo)毀 2).游標(biāo)迭代完畢 3).默認(rèn)游標(biāo)超過(guò)10分鐘沒(méi)用也會(huì)別清除 13、查詢快照 快照后就會(huì)針對(duì)不變的集合進(jìn)行游標(biāo)運(yùn)動(dòng)了,看看使用方法.?
db.persons.find({$query:{name:”Jim”},$snapshot:true}) #用快照則需要用高級(jí)查詢 高級(jí)查詢選項(xiàng) 1)$query 2)$orderby 3)$maxsan:integer 最多掃描的文檔數(shù) 4)$min:doc查詢開(kāi)始 5)$max:doc查詢結(jié)束 6)$hint:doc使用哪個(gè)索引 7)$explain:boolean統(tǒng)計(jì) 8)$snapshot:boolean 一致快照 十二、索引 1.創(chuàng)建索引
db.books.ensureIndex{{number:1}} 創(chuàng)建索引同時(shí)指定索引的名字
db.books.ensureIndex({number:1},{name:"book_"}) 2.索引使用需要注意的地方 1)創(chuàng)建索引的時(shí)候注意1是正序創(chuàng)建索引-1是倒序創(chuàng)建索引 2)索引的創(chuàng)建在提高查詢性能的同事會(huì)影響插入的性能 對(duì)于經(jīng)常查詢少插入的文檔可以考慮用索引 3)符合索引要注意索引的先后順序 4)每個(gè)鍵全建立索引不一定就能提高性能呢 索引不是萬(wàn)能的 5)在做排序工作的時(shí)候如果是超大數(shù)據(jù)量也可以考慮加上索引 用來(lái)提高排序的性能 3.唯一索引 解決文檔books不能插入重復(fù)的數(shù)值
db.books.ensureIndex({name:-1},{unique:true}) #則插入相同的name值會(huì)報(bào)錯(cuò) 4.踢出重復(fù)值 如果建議唯一索引之前已經(jīng)有重復(fù)數(shù)值如何處理 db.books.ensureIndex({name:1},{name:"book_",unique:true,dropDups:true}) #踢出重復(fù)數(shù)值 5.后臺(tái)執(zhí)行創(chuàng)建索引 為了解決創(chuàng)建索引鎖表的問(wèn)題,在不影響查詢功能,可以在后臺(tái)運(yùn)行
db.books.ensureIndex({name:1},{background:true}) 6.強(qiáng)制查詢已經(jīng)建立好的索引
db.books.find({name:"323book"}).hint({name:1}) #后一個(gè)name為索引名,正序倒序依據(jù)建立索引的規(guī)則,否則會(huì)報(bào)錯(cuò) 7.在shell查看數(shù)據(jù)庫(kù)已經(jīng)建立的索引
db.system.indexes.find() db.system.namespaces.find() 8.查詢索引信息和查詢狀態(tài)信息
db.books.find({name:"123book"}).explain() 9.批量和精確刪除索引
db.runCommand({dropIndexes : "books" , index:"name_-1"}) db.runCommand({dropIndexes : "books" , index:"*"}) 十三、二維索引 建立二維索引
db.map.ensureIndex({gis:"2d"},{min:-1,max:201}) #默認(rèn)會(huì)建一個(gè)[-108,108]的范圍 1.查詢點(diǎn)(70,180)最近的3個(gè)點(diǎn)
db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3) 2.查詢以點(diǎn)(50,50)和點(diǎn)(190,190)為對(duì)角線的正方形中的所有的點(diǎn)
db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1}) 3.查詢出以圓心為(56,80)半徑為50規(guī)則下的圓心面積中的點(diǎn)
db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1}) 十四、Count+Distinct+Group 1.count?查詢結(jié)果條數(shù)
db.persons.find({country:"USA"}).count() 2.Distinct?去重 請(qǐng)查詢出persons中一共有多少個(gè)國(guó)家分別是什么
db.runCommand({distinct:"persons",key:"country"}).values #key表示去重的鍵 3.group分組
db.runCommand({?group:{ ns:"集合的名字", key:"分組鍵對(duì)象", initial:"初始化累加器", $reduce:"分解器", condition:"條件", finalize:"組完成器" }}) 分組首先會(huì)按照key進(jìn)行分組,每組的 每一個(gè)文檔全要執(zhí)行$reduce的方法,他接收2個(gè)參數(shù)一個(gè)是組內(nèi)本條記錄,一個(gè)是累加器數(shù)據(jù). 請(qǐng)查出persons中每個(gè)國(guó)家學(xué)生數(shù)學(xué)成績(jī)最好的學(xué)生信息(必須在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.函數(shù)格式化分組鍵 如果集合中出現(xiàn)鍵Counrty和counTry同時(shí)存在
$keyf:function(doc){ if(doc.country){ return?{country:doc.country} } return?{country:doc.counTry} } 十五、常用命令舉例 1.查詢服務(wù)器版本號(hào)和主機(jī)操作系統(tǒng)
db.runCommand({buildInfo:1}) 2查詢執(zhí)行集合的詳細(xì)信息,大小,空間,索引等
db.runCommand({collStats:"persons"}) 3查看操作本集合最后一次錯(cuò)誤信息
db.runCommand({getLastError:"persons"}) 十六、固定集合 1.特性 固定集合默認(rèn)是沒(méi)有索引的就算是_id也是沒(méi)有索引的 由于不需分配新的空間他的插入速度是非常快的 固定集合的順是確定的導(dǎo)致查詢速度是非常快的 最適合就是日志管理 2.創(chuàng)建固定集合 創(chuàng)建一個(gè)新的固定集合要求大小是100個(gè)字節(jié),可以存儲(chǔ)文檔10個(gè)
db.createCollection("mycoll",{size:100,capped:true,max:10}) 把一個(gè)普通集合轉(zhuǎn)換成固定集合
db.runCommand({convertToCapped:"persons",size:1000}) 3.對(duì)固定集合反向排序,默認(rèn)情況是插入的順序排序
db.mycoll.find().sort({$natural:-1}) 十七、GridFS GridFS是mongoDB自帶的文件系統(tǒng)他用二進(jìn)制的形式存儲(chǔ)文件,大型文件系統(tǒng)的絕大多是特性GridFS全可以完成 使用GridFS使用mongofiles.exe命令行 1.上傳文件
mongofiles -d foobar -l "E:\1.jpg" put "1.jpg" 2.查看文件內(nèi)容
mongofiles -d foobar get "1.jpg" 3.查看所有文件
mongofiles -d foobar list 4.刪除已經(jīng)存在的文件
mongofiles -d foobar delete '1.jpg' 十八、Eval 1.服務(wù)器端運(yùn)行eval
db.eval("function(name){return name}","Jim") 2.javascript的存儲(chǔ),在服務(wù)器上保存js全局變量 把變量加入到特殊集合system.js中
db.system.js.insert({_id:"uname",value:"Jim"})
db.eval("return uname") #用eval調(diào)用 System.js相當(dāng)于Oracle中的存儲(chǔ)過(guò)程,因?yàn)関alue不單單可以寫(xiě)變量,還可以寫(xiě)函數(shù)體也就是javascript代碼 十九、啟動(dòng)配置 1.利用config配置文件來(lái)啟動(dòng)數(shù)據(jù)庫(kù)改變端口為8888 mongodb.conf文件 dbpath = D:\sortware\mongod\db port = 8888 啟動(dòng)文件 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服務(wù) 1)ctrl+c 組合鍵可以關(guān)閉數(shù)據(jù)庫(kù) 2)admin數(shù)據(jù)庫(kù)命令關(guān)閉數(shù)據(jù) use?admin db.shutdownServer 3.導(dǎo)出數(shù)據(jù)(中斷其他操作) 使用mongoexport命令行 -d指明使用的庫(kù) -c指明要導(dǎo)出的表 -o指明要導(dǎo)出的文件名 -csv指定導(dǎo)出的csv格式 -q過(guò)濾導(dǎo)出 --type<json|csv|tsv> 把數(shù)據(jù)好foobar中的persons導(dǎo)出
mongoexport?-d foobar -c persons -o D:/persons.json 導(dǎo)出其他主機(jī)數(shù)據(jù)庫(kù)的文檔
mongoexport?--host 192.168.0.16 --port 37017 4.導(dǎo)入數(shù)據(jù)(中斷其他操作) mongoimport?--db foobar --collections persons --file d:/persons.json 5.運(yùn)行時(shí)備份?mongodump.exe API: http://cn.docs.mongodb.org/manual/reference/mongodump mongodump?--host 127.0.0.1:27017 -d foobar -o d:/foobar 6.運(yùn)行時(shí)恢復(fù)?mongorestore.exe API:http://cn.docs.mongodb.org/manual/reference/mongorestore 恢復(fù)數(shù)據(jù)庫(kù) db.dropDatabase() mongorestore?--host 127.0.0.1:27017 -d foobar -directoryperdb d:/foobar/foobar 7.mongoDB是文件數(shù)據(jù)庫(kù)這其實(shí)就可以用拷貝文件的方式進(jìn)行備份 8.上鎖和解鎖
db.runCommand({fsync:1,lock:1}) #上鎖
db.currentOp() #解鎖 9.數(shù)據(jù)修復(fù) 當(dāng)停電等不可逆轉(zhuǎn)災(zāi)難來(lái)臨的時(shí)候,由于mongodb的存儲(chǔ)結(jié)構(gòu)導(dǎo)致 會(huì)產(chǎn)生垃圾數(shù)據(jù),在數(shù)據(jù)恢復(fù)以后這垃圾數(shù)據(jù)依然存在,這是數(shù)據(jù)庫(kù) 提供一個(gè)自我修復(fù)的能力.使用起來(lái)很簡(jiǎn)單 db.repairDatabase() 二十、用戶管理 1.添加用戶 為admin添加uspcat用戶和foobar數(shù)據(jù)庫(kù)的yunfengcheng用戶
use?foobar db.addUser("uspcat","123") db.system.users.find() 2.啟用用戶
db.auth("名稱","密碼") 3.安全檢查?--auth 非foobar是不能操作數(shù)據(jù)庫(kù)的,啟用自己的用戶才能訪問(wèn) 非admin數(shù)據(jù)庫(kù)的用戶不能使用數(shù)據(jù)庫(kù)命令,admin數(shù)據(jù)庫(kù)中的數(shù)據(jù)經(jīng)過(guò)認(rèn)證為管理員用戶 4.用戶刪除操作
db.system.users.remove({user:"yunfengcheng"}); 二十一、主從復(fù)制 1.主數(shù)據(jù)庫(kù)配置:
dbpath = D:\mongodb\data\db\07\8888?#主數(shù)據(jù)庫(kù)地址 port = 8888?#主數(shù)據(jù)庫(kù)端口號(hào) bind_ip = 127.0.0.1?#主數(shù)據(jù)庫(kù)所在服務(wù)器 master = true?#確定我是主服務(wù)器 從數(shù)據(jù)庫(kù)配置:
dbpath = D:\mongodb\data\db\07\7777?#從數(shù)據(jù)庫(kù)地址 port = 7777?#從數(shù)據(jù)庫(kù)端口號(hào) bind_ip = 127.0.0.1?#從數(shù)據(jù)庫(kù)所在服務(wù)器 source = 127.0.0.1:8888?#確定從數(shù)據(jù)庫(kù)監(jiān)聽(tīng)端口 #這個(gè)配置項(xiàng)(source)可以用shell動(dòng)態(tài)添加 slave = true?#確定自己是從服務(wù)器 2.主從復(fù)制的其他設(shè)置項(xiàng) --only?從節(jié)點(diǎn)?指定復(fù)制某個(gè)數(shù)據(jù)庫(kù),默認(rèn)是復(fù)制全部數(shù)據(jù)庫(kù) --slavedelay?從節(jié)點(diǎn)?設(shè)置主數(shù)據(jù)庫(kù)同步數(shù)據(jù)的延遲(單位是秒) --fastsync?從節(jié)點(diǎn)?以主數(shù)據(jù)庫(kù)的節(jié)點(diǎn)快照為節(jié)點(diǎn)啟動(dòng)從數(shù)據(jù)庫(kù) --autoresync?從節(jié)點(diǎn)?如果不同步則從新同步數(shù)據(jù)庫(kù) --oplogSize?主節(jié)點(diǎn)?設(shè)置oplog的大小(主節(jié)點(diǎn)操作記錄存儲(chǔ)到local的oplog中 3.利用shell動(dòng)態(tài)添加和刪除從節(jié)點(diǎn) 我們只要對(duì)集合進(jìn)行操作就可以動(dòng)態(tài)操作主從關(guān)系 掛接主節(jié)點(diǎn):操作之前只留下從數(shù)據(jù)庫(kù)服務(wù)
db.sources.insert({host:"127.0.0.1:8888"}) 刪除已經(jīng)掛接的主節(jié)點(diǎn):操作之前只留下從數(shù)據(jù)庫(kù)服務(wù)
db.sources.remove({host:"127.0.0.1:8888"}) 二十二、副本集 A是活躍的B和C是用于備份的,當(dāng)A出現(xiàn)了故障,這時(shí)候集群根據(jù)權(quán)重算法推選出B為活躍的數(shù)據(jù)庫(kù),當(dāng)A恢復(fù)后他自動(dòng)又會(huì)變?yōu)閭浞輸?shù)據(jù)庫(kù) 1.設(shè)置conf文件
dbpath = D:\mongodb\data\db\07\1111 port = 1111?#端口 bind_ip = 127.0.0.1?#服務(wù)地址 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" }] } }) 查看副本集狀態(tài):
rs.status() 3.節(jié)點(diǎn)和初始化高級(jí)參數(shù) standard?:常規(guī)節(jié)點(diǎn):參與投票有可能成為活躍節(jié)點(diǎn) passive?:副本節(jié)點(diǎn):參與投票,但是不能成為活躍節(jié)點(diǎn) arbiter?:仲裁節(jié)點(diǎn):只是參與投票不復(fù)制節(jié)點(diǎn)也不能成為活躍節(jié)點(diǎn) 4.高級(jí)參數(shù) Priority?:0到1000之間 ,0代表是副本節(jié)點(diǎn) ,1到1000是常規(guī)節(jié)點(diǎn) arbiterOnly?: true 仲裁節(jié)點(diǎn) members":[{ "_id":1, "host":"127.0.0.1:1111", arbiterOnly : true }]" 5.讀寫(xiě)分離 一般情況下作為副本的節(jié)點(diǎn)是不能進(jìn)行數(shù)據(jù)庫(kù)讀操作的,但是在讀取密集型的系統(tǒng)中讀寫(xiě)分離是十分必要的 設(shè)置讀寫(xiě)分離slaveOkay?: true 二十三、分片 1.分片步驟 1)創(chuàng)建一個(gè)配置服務(wù)器
shardServer.conf dbpath=D:\mongodb\data\db\08\conf port=2000 bind_ip=127.0.0.1 shardServer.bat mongod --conf shardServer.conf 2)創(chuàng)建路由服務(wù)器
mongos --port 1000 --configdb 127.0.0.1:2000 shell文件: mongo 127.0.0.1:1000/admin 3)添加2個(gè)分片數(shù)據(jù)庫(kù) 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)啟動(dòng)四個(gè)數(shù)據(jù)庫(kù)服務(wù)器 打開(kāi)路由shell命令行,為集群添加分片(允許本地訪問(wèn))"切記之前不能使用任何數(shù)據(jù)庫(kù)語(yǔ)句"
db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true}) db.runCommand({addshard:"127.0.0.1:8082",allowLocal:true}) 5)指定打開(kāi)分片功能的數(shù)據(jù)庫(kù)
db.runCommand({enablesharding:"foobar"}) 6)指定集合進(jìn)行分片,并設(shè)置片鍵
db.runCommand({shardcollection:"foobar.persons",key:{_id:1}}) 7)插入大數(shù)據(jù)量進(jìn)行測(cè)試 進(jìn)入分片8081查詢數(shù)據(jù)條數(shù)
db.persons.find().count() 2.查看配置庫(kù)對(duì)于分片配置存儲(chǔ)信息
db.printShardingStatus() 3.查看集群對(duì)persons的自動(dòng)分片機(jī)制配置信息
mongos> db.shards.find() { "_id" : "shard0000", "host" : "127.0.0.1:8081" } { "_id" : "shard0001", "host" : "127.0.0.1:8082" }
轉(zhuǎn)載于:https://www.cnblogs.com/boshen-hzb/p/7646949.html
總結(jié)
以上是生活随笔為你收集整理的mongon命令(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (转)利用CAS算法实现通用线程安全状态
- 下一篇: 2017.10.3北京清北综合强化班DA