1、創建資料庫
use testdb
2、創建集合
db.t_member.insert({name:"zhaomin",age:23})
3、查詢
db.t_member.find()
db.t_member.findOne()
4、修改
db.t_member.update({name:"zhaomin"},{$set:{age:18}}) #不會影響其他屬性列 ,主鍵沖突會報錯
db.t_member.update({name:"zhaomin"},{$set:{age:18}},true)#第三個引數為true 則執行insertOrUpdate操作,查詢出則更新,沒查出則插入,或者
var p = db.t_member.findOne();
db.t_member.update(p,{name:"zhaomin1"}) #會洗掉其他的屬性列
5、洗掉
db.t_member.remove({age:1}) #洗掉滿足條件的第一條 只洗掉資料 不洗掉索引
#洗掉集合
db.t_member.drop();
#洗掉資料庫
db.dropDatabase();
6、查看集合
show collections
7、查看資料庫
show dbs
8、插入資料
db.t_member.insert() #不允許鍵值重復
db.t_member.save() #若鍵值重復,可改為插入操作
9、批量更新
db.t_member.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true);
批量操作需要和選擇器同時使用,第一個false表示不執行insertOrUpdate操作,第二個true表示執行批量
10、更新器
$set : 指定一個鍵值對,若存在就進行修改,不存在則添加
$inc :只使用于數字型別,可以為指定鍵值對的數字型別進行加減操作:
db.t_member.update({name:"zhangsan"},{$inc:{age:2}})
執行結果是名字叫“zhangsan”的年齡加了2
$unset : 洗掉指定的鍵
db.t_member.update({name:"zhangsan"},{$unset:{age:1}})
$push : 陣列鍵操作:1、如果存在指定的陣列,則為其添加值;2、如果不存在指定的陣列,則創建陣列鍵,并添加值;3、如果指定的鍵不為陣列型別,則報錯;
$pushAll : 批量想陣列鍵插入值
db.t_member.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}});
$addToSet : 當指定的陣列中有這個值時,不插入,反之插入
db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #則不會添加到陣列里
$pop:洗掉指定陣列的值,當value=https://www.cnblogs.com/gupaoedu-tom/archive/2022/01/04/1 洗掉最后一個值,當value=-1 洗掉第一個值
db.t_member.update({name:"zhangsan"},{$pop:{classes:1}}) #洗掉了最后一個值
$pull : 洗掉指定陣列指定的值
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}}) #$pullAll批量洗掉指定陣列
db.t_member.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}})
#若陣列中有多個Chinese,則全洗掉
$ : 修改指定陣列時,若陣列有多個物件,但只想修改其中一些,則需要定位器:
db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}})
$addToSet 與 $each結合完成批量陣列更新操作
db.t_member.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}})
11、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
12、系統命令舉例
1、查詢服務器版本號和主機作業系統
db.runCommand({buildInfo:1})
2、查詢執行集合的詳細資訊,大小,空間,索引等
db.runCommand({collStats:"persons"})
3、查看操作本集合最后一次錯誤資訊
db.runCommand({getLastError:"persons"})
13、固定集合
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})
14、MongoDB高級查詢
db.t_member.find({},{_id:0,name:1})
第一個空括號表示查詢全部資料,第二個括號中值為0表示不回傳,值為1表示回傳,默認情況下若不指定主鍵,主鍵總是會被回傳;
db.persons.find({條件},{指定鍵});
比較運算子:$lt: < $lte: <= $gt: > $gte: >= $ne: !=
14.1、查詢條件
db.t_member.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1})
#查詢年齡大于等于25小于等于27的人
db.t_member.find({country:{$ne:"韓國"}},{_id:0,name:1,country:1})
#查詢出所有國籍不是韓國的人的數學成績
14.2、包含與不包含(僅針對于陣列)
$in 或 $nin
db.t_member.find({country:{$in:["China","USA"]}},{_id:0,name:1:country:1})
#查詢國籍是中國或美國的學生資訊
14.3、$or查詢
db.t_member.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1}) #查詢語文成績大于85或者英語大于90的學生資訊
db.t_member.update({country:"China"},{$set:{sex:"m"}},false,true)
#把中國國籍的學生上增加新的鍵sex
db.t_member.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})
#查詢出sex為null的人
14.4、正則運算式
db.t_member.find({name:/li/i},{_id:0,name:1})
#查詢出名字中存在”li”的學生的資訊
14.5、$not的使用
$not和$nin的區別是$not可以用在任何地方兒$nin是用到集合上的
db.t_member.find({name:{$not:/li/i}},{_id:0,name:1})
#查詢出名字中不存在”li”的學生的資訊
14.6、$all與index的使用
db.t_member.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1})
#查詢喜歡看MONGOD和JS的學生
db.t_member.find({"books.1":"JAVA"},{_id:0,name:1,books:1})
#查詢第二本書是JAVA的學習資訊
14.7、$size的使用,不能與比較查詢符同時使用
db.t_member.find({books:{$size:4}},{_id:0,name:1})
#查詢出喜歡的書籍數量是4本的學生
14.8、查詢出喜歡的書籍數量大于4本的學生本的學生
1、增加size鍵
db.t_member.update({},{$set:{size:4}},false,true)
2、添加書籍,同時更新size
db.t_member.update({name:"jim"},{$push:{books:"ORACL"},$inc:{size:1}})
3、查詢大于3本的
db.t_member.find({size:{$gt:4}},{_id:0,name:1,size:1})
14.9、$slice運算子回傳檔案中指定陣列的內部值
db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}})
#查詢出Jim書架中第2~4本書
db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}})
#查詢出最后一本書
14.10、檔案查詢
查詢出在K上過學且成績為A的學生
1、絕對查詢,順序和鍵個數要完全符合
db.t_member.find({school:{school:"K","score":"A"}},{_id:0,name:1})
2、物件方式,但是會出錯,多個條件可能會去多個物件查詢
db.t_member.find({"school.school":"K","school.score":"A"},{_id:0,name:1})
3、正確做法單條條件組查詢$elemMatch
db.t_member.find({school:{$elemMatch:{school:"K",score:"A"}},{_id:0,name:1})
db.t_member.find({age:{$gt:22},books:"C++",school:"K"},{_id:0,name:1,age:1,books:1,school:1})
14.11、分頁與排序
1、limit回傳指定條數 查詢出persons檔案中前5條資料:
db.t_member.find({},{_id:0,name:1}).limit(5)
2、指定資料跨度 查詢出persons檔案中第3條資料后的5條資料
db.t_member.find({},{_id:0,name:1}).limit(5).skip(3)
3、sort排序 1為正序,-1為倒序
db.t_member.find({},{_id:0,name:1,age:1}).limit(5).skip(3).sort({age:1})
注意:mongodb的key可以存不同型別的資料排序就也有優先級
最小值->null->數字->字串->物件/檔案->陣列->二進制->物件ID->布爾->日期->時間戳->正則->最大值
14.12、游標
利用游標遍歷查詢資料
var persons = db.persons.find();
while(persons.hasNext()){
obj = persons.next();
print(obj.name)
}
游標幾個銷毀條件
1).客戶端發來資訊叫他銷毀
2).游標迭代完畢
3).默認游標超過10分鐘沒用也會別清除
14.13 聚合查詢(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;
}
}
})
14.15 函式格式化分組鍵
如果集合中出現鍵Counrty和counTry同時存在
$keyf:function(doc){
if(doc.country){
return {country:doc.country}
}
return {country:doc.counTry}
}
15、MongoDB快照管理
快照后就會針對不變的集合進行游標運動了,看看使用方法.
db.persons.find({$query:{name:”Jim”},$snapshot:true})
#用快照則需要用高級查詢
高級查詢選項
| 選項 | 解釋 |
|---|---|
| $query | |
| $orderby | |
| $maxsan | integer 最多掃描的檔案數 |
| $min | doc查詢開始 |
| $max | doc查詢結束 |
| $hint | doc使用哪個索引 |
| $explain | boolean統計 |
| $snapshot | boolean 一致快照 |
15.1、查詢點(70,180)最近的3個點
db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)
15.2、查詢以點(50,50)和點(190,190)為對角線的正方形中的所有的點
db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})
15.3、查詢出以圓心為(56,80)半徑為50規則下的圓心面積中的點
db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1})
16、MongoDB用戶管理
16.1、添加用戶
為testdb添加tom用戶
use testdb
db.createUser({user:"tom",pwd:"123",roles:[{ role:"dbAdmin",db:"testdb"}]})
具體角色有
read:允許用戶讀取指定資料庫
readWrite:允許用戶讀寫指定資料庫
dbAdmin:允許用戶在指定資料庫中執行管理函式,如索引創建、洗掉,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定資料庫里創建、洗掉和管理用戶
clusterAdmin:只在admin資料庫中可用,賦予用戶所有分片和復制集相關函式的管理權限,
readAnyDatabase:只在admin資料庫中可用,賦予用戶所有資料庫的讀權限
readWriteAnyDatabase:只在admin資料庫中可用,賦予用戶所有資料庫的讀寫權限
userAdminAnyDatabase:只在admin資料庫中可用,賦予用戶所有資料庫的userAdmin權限
dbAdminAnyDatabase:只在admin資料庫中可用,賦予用戶所有資料庫的dbAdmin權限,
root:只在admin資料庫中可用,超級賬號,超級權限
16.2查看所有用戶
db.system.users.find()
和用戶管理相關的操作基本都要在admin資料庫下運行,要先use admin;
如果在某個單一的資料庫下,那只能對當前資料庫的權限進行操作
16.3、用戶洗掉操作
db.system.users.remove({user:"tom"});
16.4查看當前用戶權限
db.runCommand({usersInfo:"tom",showPrivileges:true})
16.5修改密碼
use testdb
db.changeUserPassword("tom", "123456")
1.6、啟用用戶
db.auth("tom","123")
16.7、安全檢查 --auth
非testdb是不能操作資料庫的,啟用自己的用戶才能訪問
非admin資料庫的用戶不能使用資料庫命令,admin資料庫中的資料經過認證為管理員用戶

本文為“Tom彈架構”原創,轉載請注明出處,技術在于分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力,
原創不易,堅持很酷,都看到這里了,小伙伴記得點贊、收藏、在看,一鍵三連加關注!如果你覺得內容太干,可以分享轉發給朋友滋潤滋潤!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403530.html
標籤:其他
