1. 程式人生 > >Mongodb 操作入門以及CRUD

Mongodb 操作入門以及CRUD

#關閉伺服器
db.shutdownServer()


#mongodb中,collection相當於表,文件相當於記錄
#對於資料庫的操作:db.help()
use dbname#切換(或建立)資料庫,如果不存在,則在用到它的時候自動建立(比如插入文件時)
show dbs#列出所有資料庫
show collections==db.getCollectionNames()==show tables(建議不使用)
db.stats()#檢視資料庫狀態
db.dropDatabase()#刪除當前資料庫


#對於collection的操作:db.<collection>.help()
db.my_coll.count()#查詢當前集合中文件的總數目
db.mycollection.find()#查詢所有文件
db.mycollection.find({x:1})#查詢指定文件


db.mycollection.insert({x:2,y:3,...})#插入文件


#更新符合條件的1個文件
db.mycollection.update({x:1},{x:111})#更新符合條件的文件
db.mycollection.update({x:1},{$set:{y:333}})#更新符合條件的文件的部分欄位
db.mycollection.update({z:1},{z:111},true)#更新符合條件的文件,若不存在則建立


#更新符合條件的多個文件
db.mycollection.update({x:1}{$set:{x:2}},false,true)


db.mycoll.drop() #drop the collection刪除該集合
db.mycoll.remove(query)#刪除符合條件的所有文件


#索引
db.mycoll.getIndexes()#獲取當前集合的索引情況,預設只有"_id"一個索引
#建立索引
#如果文件數目較多,建立索引需要一定的時間
#如果系統負載較重且有很多已存在的文件,不能直接使用這個命令建立索引--
#需要在使用資料庫之前就將索引建立完成,否則嚴重影響資料庫的效能
#由於索引會在插入文件後再次構建,所以會對寫入造成一定影響,為了查詢的高效值得
db.mydb_collection.ensureIndex({x:1})#x為1代表正向索引,-1代表逆向索引


#_id索引
系統預設的索引,不能被drop


#單鍵索引
最普通的索引


#多鍵索引
陣列型別的變數,其值有多個
db.mydb_collection.insert({x:[1,2,3,4]})#執行後,這條文件的多建索引形成


#複合索引
#有時查詢條件不止一個,這就要用到複合索引了
db.mydb_collection.ensureIndex({x:1,y:1})


#過期索引(TTL索引)在一段時間後會過期失效的索引
#索引過期後相應的資料會被刪除
#適合儲存一些比如使用者登入的資訊、日誌資訊
#用法注意:過期索引欄位的值必須是ISODate型別,不能是時間戳,否則不會被自動刪除
#索引過期後的刪除操作(系統每60秒執行一次)存在誤差,因為需要時間來執行啊
db.mydb_collection.ensureIndex({time:1},{expireAfterSeconds:10})
db.mydb_collection.insert({time:new Date()});


#全文索引
#每個集合只允許建立一個全文索引
db.articles.ensureIndex({key:"text"})#單個欄位建立全文索引
db.articles.ensureIndex({key_1:"text",key_2:"text"})#多個欄位建立全文索引
db.articles.ensureIndex({"$**":"text"})#所有欄位建立全文索引
#使用全文索引來查詢
db.articles.find({$text:{$search:"coffee"}})#查詢包含"coffee"的文件
db.articles.find({$text:{$search:"aa bb"}})#查詢包含"aa"或"bb"的文件
db.articles.find({$text:{$search:"aa bb -cc"}})#查詢包含"aa"或"bb"但不含"cc"的文件
db.articles.find({$text:{$search:"\"aa\" \"bb\"}})#查詢同時包含"aa"和"bb"的文件
db.articles.find({$text:{$search:"\"aa\" \"bb\" -cc"}})


#全文索引相似度查詢
db.my_coll.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}})
#按照相似度來排序
db.my_coll.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}})
.sort({score:{$meta:"textScore"}})

#刪除全文索引


#全文索引使用限制
1.每次查詢只能指定一個$text查詢
2.$text查詢不能出現在$nor查詢中($nor用來排除查詢條件)
3.查詢中若包含$text,hint將失效(hint用來強制指定將使用的索引)
4.MongoDB全文索引暫不支援中文


#索引的屬性
1.指定索引的名字
db.my_coll.ensureIndex({x:1},{name:"my_index"})(如果不指定name預設的名字是x_1)
2.指定索引的唯一性(報錯了。。。。)
db.my_coll.ensureIndex({x:1,y:1},{unique:true})當插入的文件索引欄位相同時會報錯,並插入失敗
db.my_coll.ensureIndex({x:1,y:1},{name:"my_index"},{unique:true})(指定名字後無錯),但不具有唯一性
3.指定索引的稀疏性(預設是false);true代表不為不包含指定索引的欄位的文件建立索引(比如插入一條不包含索引欄位的文件)
db.my_coll.ensureIndex({x:1,y:1},{sparse:true/false})
#稀疏索引帶來的隱患
#當不在x欄位上建立稀疏索引時,以下語句能夠正確執行
db.my_coll.find({x:{$exists:true}})#查詢含有欄位x的所有文件
db.my_coll.find({x:{$exists:false}})#查詢不含有欄位x的所有文件
db.my_coll.remove({x:{$exists:true}})#刪除含有欄位x的所有文件


#不能在稀疏索引上查詢不包含這個欄位的文件,因為那些文件壓根就沒有被建立索引^_^
#用hint來強制指定使用索引,這時候返回結果為空
#這裡有點不明白,道理確實是這樣,但不使用hint時,執行結果在邏輯上卻是正確的
db.my_coll.find({x:{$exists:false}}).hint("x_1")
4.指定索引的過期時間,也就是前面提到的過期索引


#地理位置索引
概念:把一些點的位置存放在mongodb中,建立索引後,可以按照位置來查詢其他點
子分類:
2d索引:用於儲存和查詢平面上的點
2dsphere索引,用於儲存和查詢球面上的點
查詢方式:
查詢距離某個點一定距離內的點(附近的人)$near查詢
查詢某個形狀內所包含的點(指定某市區)$geoWithin查詢
#建立2d索引:表示方法:[經度,緯度]範圍:經度[-180,180]緯度[-90,90]
db.location.ensureIndex({w:"2d"})
插入一些文件:
db.location.insert({w:[1,1]})
db.location.insert({w:[1,2]})
db.location.insert({w:[1,3]})
查詢距離點[1,1]最近的點,預設返回最多100條文件:
db.location.find({w:{$near[1,1]}})
db.location.find({w:{$near:[1,3],$maxDistance:1}})#限制最遠距離($minDistance在2d索引中不起作用)
#形狀的表示方式
1.矩形:{$box:[[<x1>,<y1>],[<x2>,<y2>]]}
2.圓形:{$center:[[<x1>,<y1>],r]}
3.多邊形:{$polygon:[[<x1>,<y1>],[<x2>,<y2>]],[<x3>,<y3>]...}
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
db.location.find({w:{$geoWithin:{$center:[[30,30],50]}}})
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[1,1],[100,90],[110,-90]]}}})
#geoNear查詢
db.runCommand(
{geoNear:<collection>,
near:[x,y],
minDistance:(對2d索引無效)
maxDistance:
num:
...}
)


#2dsphere索引
db.location.ensureIndex({w:"2dsphere"})
#位置表示方式:GeoJSON:描述一個點,一條直線,多邊形等
#格式:{type:"**",coordinates:[<coordinates>]}
#查詢方式與2d索引類似,查閱相關文件


#索引構建情況分析
好處:加快查詢速度
壞處:增加磁碟空間消耗,降低寫入效能
1.mongostat檢視mongodb執行狀態的程式
用法:mongostat -h 127.0.0.1:27017;mongostat --help;
2.profile(0,1,2三個級別,0:off關閉狀態不記錄 1:記錄超過slowms的操作 2:記錄所有操作)
db.setProfilingLevel(0/1/2)#設定級別
db.getProfilingStatus()#檢視詳細狀態
#記錄的操作存放在system.profile集合中
db.system.profile.find().sort($natural:-1).limit(1)#查詢最後一條操作
#$natural:-1代表按照時間順序的逆序排序,1代表按照時間順序排序
3.日誌


4.explain分析
用法:語句後加".explain()"
例如:db.location.find().explain()


#mongodb安全
1.啟動時指定--auth
建立使用者:
db.createUser(
{
user:"<name>",
pwd:"<...>",
customData:{<any information>},
roles:[{role:"<role>",db:"<database>"},{role:"<role>",db:"<database>"}]
}
)
角色型別:read readWrite,dbAdmin,dbOwner,userAdmin(許可權依次變大)
2.keyfile