MongoDB 聚合操作 與python互動
聚合操作
對文件的資訊進行整理統計的操作
返回:統計後的文件集合
db.collection.aggregate()
功能:聚合函式,完成聚合操作
引數:聚合條件,配合聚合操作符使用
返回:聚合後的結果
聚合操作符
$group 分組聚合 要配合具體的統計操作符獲取結果
$sum 求和
e.g.
db.class1.aggregate({$group:{_id:'$gender',
分組 按照gender值統計
num:{$sum:1}}})
統計結果,求和每有一個加1
e.g. 統計所有男生和女生的年齡之和
db.class1.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})
$avg 平均值
e.g. 求男生 女生年齡的平均數
db.class1.aggregate({$group:{_id:'$gender',num:{$avg:'$age'}}})
$max 求最大值
e.g. 求男生女生的年齡最大值
db.class1.aggregate({$group:{_id:'$gender',num:{$max:'$age'}}})
$min 求最小值
e.g. 求男生女生的年齡最小值
db.class1.aggregate({$group:{_id:'$gender',num:{$min:'$age'}}})
$project
用於修改文件的顯示效果
e.g. $project值的用法同find()的field引數相同
db.class1.aggregate({$project:{_id:0,name:1,age:1}})
e.g. 自定義顯示的域名
db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match
過濾想要的資料
e.g. 過濾年齡大於30的資料,$match值的寫法同query
db.class1.aggregate({$match:{age:{$gt:30}}})
$limit
顯示前幾個文件
e.g.
db.class1.aggregate({$limit:3})
$skip
跳過前幾個文件顯示
e.g.
db.class1.aggregate({$skip:2})
$sort 排序
e.g. 按照年齡排序
db.class1.aggregate({$sort:{age:1}})
聚合管道
將前一個聚合操作產生的結果,交給後一個聚合操作繼續使用
db.collection.aggregate([{聚合1},{聚合2},{}...])
e.g. $match --> $sort -->$project
db.class1.aggregate([{$match:{gender:'m'}},{$sort:{age:1}},{$project:{_id:0}}])
聚合練習
使用grade資料庫
給更多同學新增 域score
score:{english:87,chinese:76,math:91}
1. 按照性別統計每組人數
aggregate({$group:{_id:'$sex',num:{$sum:1}}})
2. 統計該班中有哪個同學姓名為重名同學
aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
3. 統計所有男生的語文成績,只打印姓名,性別,語文成績即可
aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,sex:1,'score.chinese':1}}])
4. 將所有女生按照英語成績降序排序
aggregate([{$match:{sex:'w'}},{$sort:{'score.english':-1}}])
檔案儲存
1.儲存路徑
將檔案放在本地路徑(網路路徑)下,然後資料庫中儲存該檔案的查詢路徑
優點 : 節省資料庫空間
缺點 : 當資料或者檔案位置發生變化時檔案即丟失
2. 將檔案轉換為二進位制,儲存檔案本身
資料庫支援二進位制資料格式
將檔案轉換為二進位制格式,然後存入資料庫中
優點 : 資料庫和檔案繫結,資料庫在檔案即在
缺點 : 佔用資料庫空間大,存取效率低
mongodb儲存檔案本身
* 如果是小檔案建議轉換二進位制直接插入
* 如果是大檔案建議使用GridFS方案儲存 >16M
GridFS方案解釋
1. 在mongodb一個數據庫中使用兩個集合配合儲存檔案
2. fs.files 用來儲存檔案的相關資訊,為每一個檔案建立一個文件,儲存檔名,檔案大小,存入時間。。。
3. fs.chunks 用來分塊儲存檔案的實際內容
Binary data 型別資料
儲存方法
mongofiles -d dbname put file
資料庫 要儲存的檔案
* 資料庫不存在會自動建立資料庫
資料庫中會自動建立fs.files fs.chunks兩個集合
fs.files文件結構
{ "_id" : ObjectId("5b7cdcd769d72e12b4f166d0"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-08-22T03:47:35.381Z"), "length" : 305033, "md5" : "3698b5e762b5b396766aaf9feef7e10d", "filename" : "file.jpg" }
fs.chunks文件結構
{ "_id" : ObjectId("5b7cdcd769d72e12b4f166d2"), "files_id" : ObjectId("5b7cdcd769d72e12b4f166d0"), "n" : 1, "data" : BinData(0,"tQWR0AR......AG") }
* 同一個檔案fs.files中的_id值等於fs.chunks中的 files_id域的值
提取方法
mongofiles -d dbname get file
GridFS方案優缺點
優點 : 儲存方便,提供較好的命令支援和程式設計介面
缺點 : 存取效率低
mongo shell中獲取遊標
* mongo shell下支援JS程式碼,可以通過JS獲取遊標,進而獲取資料操作結果。
e.g.
var cursor = db.class1.find()
cursor.next() 獲取下一條結果
cursor.hasNext() 檢視是否有下一個物件
通過python操作 MongoDB
pymongo 模組 第三方模組
安裝
sudo pip3 install pymongo
操作步驟
1. 連線資料庫,生成資料庫連線物件
conn = pymongo.MongoClient('localhost',27017)
2. 選擇要操作的資料庫,生成資料庫物件 (__setitem__)
db = conn.stu
db = conn['stu']
3. 獲取集合物件
myset = db.class0
myset = db['class0']
4. 通過集合物件呼叫mongodb資料庫操作函式
增刪改查,聚合,索引。。。。。
5. 關閉資料庫連線
conn.close()
插入文件
insert() 插入資料 功能同 mongoshell
insert_many() 插入多條
insert_one() 插入一條
save() 插入資料,通過_id可以修改
查詢操作
find()
功能 : 對資料庫進行查詢
引數 : 同mongoshell find()
返回值 : 返回遊標物件
cursor 屬性函式
next()
limit()
skip()
count()
sort()
pymongo : sort([('age',-1),('name',1)])
mongoshell : sort({age:-1,name:1})
* 如果通過for或者next操作了遊標物件,再呼叫limit,skip,sort會報錯
find_one()
用法同mongoshell中 findOne()
返回一個字典
修改操作
update(query,update,upsert = False,multi = False)
update_many()
update_one()
刪除操作
remove(query,multi = True)
功能: 刪除文件
引數: query 篩選條件
multi 預設True表示刪除所有符合條件的
False只刪除一條
索引操作
ensure_index() 建立索引
list_indexes() 檢視索引
drop_index() 刪除一個索引
drop_indexes() 刪除所有索引
聚合操作
aggregate([])
引數和mongoshell一樣
返回值和find()函式一樣也是得到一個遊標物件
pymongo進行檔案存取操作
GridFS 檔案提取
import gridfs
1. 連線資料庫,獲取相應的資料庫物件
2. 通過 gridfs.GridFS(db) 獲取集合物件(代表儲存檔案的兩個集合)
3. 通過find()查詢檔案返回遊標
4. 通過迴圈遍歷遊標獲取指定檔案物件,read()讀取檔案內容寫入本地
以二進位制的方式存取檔案
import bson.binary