1. 程式人生 > >MongoDB 聚合操作 與python互動

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