非關係型資料庫——Mongodb筆記
SQL:
- 關係型資料模型
- 資料被存放在表中
- 每條記錄(資料)都是相同型別並且具有相同屬性
- 儲存資料需要定義
- 新增新資料必須修改表結構
- ACID事務支援
NoSQL
- 非關係型資料模型
- 可以儲存json、鍵值對等
- 靈活設定表結構
- 混合儲存資料型別(不影響其他資料)
- 支援ACID事務
- 一致性可以改變
- 橫向擴充套件
MongoDB術語 1.文件(document)相當於傳統資料庫中的“行”,但是比“行”複雜(資訊) 2.集合(collections)在MongoDB中表示一組文件,類似表,集合是沒有模式(可以混合插入不同的資料型別)的 3.資料庫(database)MnogoDB基礎命令
show collections檢視集合名 post={'':'','':''.........}資料 db.tablename.insert(post)插入資料 db.tablename.find() db.tablename.find().pretty()格式化查詢結果
db.pyus
er.find({age:{$lt:50,$gt:45}}).pretty() 查詢age大於45小於50的資訊 $gt > $lt < $lte <= $gte >= db.pyuser.find({},{name:1}) 1表示True,取指定欄位名稱,預設一頁顯示20 條 it 顯示更多記錄
db.pyuser.find({age:50},{name:1,age:1}).pretty() 第一個字典為查詢條件
db.pyuser.find().sort({age:1}).pretty()1表示升序,-1表示降序 ——————————————limit—————————————————— db.pyuser.find().skip(3).limit(3).pretty() skip跳過 limit限制條數
db.pyuser.find({$or:[{age:25},{age:50}]}).pretty()查詢年齡是25或50的資訊
db.pyuser.count()查詢集合的條數
db.goods.find(age:{$exists:true})查詢具有age欄位的記錄
db.pytest.drop()刪除pytest表
insert:在insert增加id屬性時,當表如果有該id對應的資料,插入會報錯,錯誤原因為duplicate key error. save:當表如果有該id對應的資料,會修改該表中的原有屬性.
更新: db.pytest1.update({name:'aa'},{$set:{name:'newaa'}}) 更新一條 db.pytest1.update({name:'bb'},{$set:{name:'newbb'}},false,true) 全部更新 update(條件,更新資料,是否插入新資料,是否全部更新)
是否插入資料表示:如果不存在update條件匹配的記錄,是否要插入到集合中。預設為false不插入,true插入
mysqladmin -u root -p password 修改mysql密碼 db.user.aggregate([{$group:{_id:"$sex",total:{$sum:1}}}])按sex分組,統計每組個數,升序排列。 db.user.aggregate([{$group:{_id:"$sex",avg:{$avg:"$score"}}}])按sex分組,統計每組平均數。 __________________________push_______________________________ db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score"}}}]) { "_id" : "f", "scores" : [ 95 ] } { "_id" : "m", "scores" : [ 100, 90, 85, 75 ] }統計每組的具體值
> db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score",$push:'$name'}}}]) { "_id" : "f", "scores" : [ "董明珠" ] } { "_id" : "m", "scores" : [ "Jack Ma", "Pnoy Ma", "Robin Li", "IG.wxz" ] } 分組顯示全部資料 > db.user.aggregate([{$group:{_id:"$sex",scores:{$push:"$score"},name:{$push:'$name'}}}]) { "_id" : "f", "scores" : [ 95 ], "name" : [ "董明珠" ] } { "_id" : "m", "scores" : [ 100, 90, 85, 75 ], "name" : [ "Jack Ma", "Pnoy Ma", "Robin Li", "IG. wxz" ] } #去重 > db.user.aggregate([{$group:{_id:'$sex',names:{$addToSet:'$name'}}}]) { "_id" : "f", "names" : [ "董明珠" ] } { "_id" : "m", "names" : [ "IG.wxz", "Robin Li", "Pnoy Ma", "Jack Ma" ] } #獲取分組的第一個值 > db.user.aggregate([{$group:{_id:'$sex',firstname:{$first:'$name'}}}]) { "_id" : "f", "firstname" : "董明珠" } { "_id" : "m", "firstname" : "Jack Ma" } ————————————————————————————————————————管道的概念: 管道在Unix和Linux中一般用於將當前命令的輸出結果作為(下是一個條件/下有一個命令)的引數。 MongDB的聚合管道是將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理,管道的操作是可以重複的。 管道操作有以下: 1.$project 作用是修改文件的結構,用來重新命名,增加或刪除 文件中的欄位。 查詢name和score域 > db.user.aggregate({$project:{name:1,score:1,_id:0}}) { "name" : "Jack Ma", "score" : 100 } { "name" : "Pnoy Ma", "score" : 90 } { "name" : "Robin Li", "score" : 85 } { "name" : "董明珠", "score" : 95 } { "name" : "IG.wxz", "score" : 75 } { "name" : "IG.wxz", "score" : 90 } 將查詢到的結果的score加10 > db.user.aggregate({$project:{name:1,score:{$add:["$score",10]}}}) { "_id" : ObjectId("5b95b8f087e544934782321e"), "name" : "Jack Ma", "score" : 110 } { "_id" : ObjectId("5b95b93187e544934782321f"), "name" : "Pnoy Ma", "score" : 100 } { "_id" : ObjectId("5b95b95287e5449347823220"), "name" : "Robin Li", "score" : 95 } { "_id" : ObjectId("5b95b96b87e5449347823221"), "name" : "董明珠", "score" : 105 } { "_id" : ObjectId("5b95b99487e5449347823222"), "name" : "IG.wxz", "score" : 85 } { "_id" : ObjectId("5b95c05887e5449347823223"), "name" : "IG.wxz", "score" : 100 } ———————————————————————————————————————— 2.$match 作用於過濾文件,相當於find()第一個引數 注意: (1)在$math中不能和$where表示式混合使用 (2)如果$math位於管道的第一個階段,可以利用索引提高查詢速 (3)$math儘量出現在管道的最前面,過濾出需要的資料,在後續的階段中可以提高效率 (4)$math中使用$text操作符的話,只能位於管道的第一階段 > db.user.aggregate([{$project:{_id:0}},{$match:{'score':{$lt:90}}}]) { "name" : "Robin Li", "age" : 40, "sex" : "m", "score" : 85 } { "name" : "IG.wxz", "age" : 30, "sex" : "m", "score" : 75 }
> db.user.aggregate([{$project:{_id:0}},{$match:{'score':{$gt:80,$lt:100}}},{$group:{_id:' $sex',count:{$sum:1}}}]) { "_id" : "f", "count" : 1 } { "_id" : "m", "count" : 3 } —————————————————————————————————————— 3.$sort > db.user.aggregate([{$sort:{score:1}},{$project:{_id:0}},{$limit:2}])#按分數排序,且顯示前兩條 { "name" : "IG.wxz", "age" : 30, "sex" : "m", "score" : 75 } { "name" : "Robin Li", "age" : 40, "sex" : "m", "score" : 85 } **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** $or、$nor、$not、$and ###表示式運算子 > db.user.aggregate([{$project:{_id:0,name:1,newscore:{$and:[{$ne:['$score',90]},{$ne:['$s ex','f']}]}}}]) { "name" : "Jack Ma", "newscore" : true } { "name" : "Pnoy Ma", "newscore" : false } { "name" : "Robin Li", "newscore" : true } { "name" : "董明珠", "newscore" : false } { "name" : "IG.wxz", "newscore" : true } { "name" : "IG.wxz", "newscore" : false } > db.user.aggregate([{$project:{_id:0,name:1,newscore:{$and:[{$eq:['$score',90]},{$eq:['$s ex','f']}]}}}]) { "name" : "Jack Ma", "newscore" : false } { "name" : "Pnoy Ma", "newscore" : false } { "name" : "Robin Li", "newscore" : false } { "name" : "董明珠", "newscore" : false } { "name" : "IG.wxz", "newscore" : false } { "name" : "IG.wxz", "newscore" : false }
比較運算子 $eq $gt $lt $gte $lte $ne
> db.pytimer.aggregate([{$project:{year:{$year:'$data'},hour:{$hour:'$data'},week:{$week:' $data'},dayofweek:{$dayOfWeek:'$data'}}}]) { "_id" : ObjectId("5b95e59087e5449347823224"), "year" : 2018, "hour" : 3, "week" : 36, "d ayofweek" : 2 } 聚合管道的優化 這是一個策略: (1)將$match和$sort放到管道的前面,可以給集合建立索引,提高處理資料的效率 (2)可以使用match limit skip 對文件進行提前過濾,減少後續處理文件的數量 階段優化 (1)sort + match 順序優化 如果match在sort之後,優化器會自動把match放到sort之前 (2)limit+skip 如果skip在limit之後,優化器會吧limit移動到skip之前,移動後的limit的 值等於原來的值加上skip的值 eg: skip 10 limit 5————》limit 15 skip 10
聚合管道的限制作用就是對返回結果大小和記憶體的限制 MongoDB對返回結果的大小限制 返回一個文件大小不能超過16M只是MongoDB2.6版本之前的規定 2.6之後返回的結果可以是一個遊標或者放到集合裡,返回不受16M限制 記憶體的要求 管道每一個階段只能使用100M記憶體,如果超過會報錯,如果處理大資料時, 可以使用allowDiskUse選項,將資料存到磁碟上。以上的可以稱為 多目管道 單目管道distinct()\count()