上一篇主要介紹了MongoDB的基本操作,包括創建、插入、保存、更新和查詢等,鏈接為 "MongoDB基本操作" 。 在本文中主要介紹MongoDB的聚合以及與Python的交互。 MongoDB聚合 什麼是聚合 MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等), ...
上一篇主要介紹了MongoDB的基本操作,包括創建、插入、保存、更新和查詢等,鏈接為MongoDB基本操作。
在本文中主要介紹MongoDB的聚合以及與Python的交互。
MongoDB聚合
什麼是聚合
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。
聚合是基於數據處理的聚合管道,每個文檔通過由多個階段組成的管道,可以對每個階段的管道進行分組、過濾等功能,然後經過一系列處理,輸出結果。
語法:db.集合名稱.aggregate({管道: {表達式}})
管道一般用於將當前命令的輸出結果作為下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重覆的。
常用管道
下麵介紹常用的管道:
$group
:將集合中的文檔分組,可用於統計結果$match
:過濾數據,只輸出符合條件的文檔$project
:修改輸入文檔的結構,如重命名、增加、刪除欄位,也可用於創建計算結果以及嵌套文檔$sort
:將輸入文檔排序後輸出$limit
:限制聚合管道返回的文檔數$skip
:跳過指定數量的文檔,並返回餘下的數據$unwind
:將數組類型的欄位進行拆分
常用聚合表達式
下麵介紹常用的聚合表達式:
$sum
:計算總和,$sum:1
表示以1計數$avg
:計算平均值$min
:獲取最小值$max
:獲取最大值$push
:在結果文檔中插入值到一個數組中$first
:根據資源文檔的排序,獲取第一個文檔數據$last
:根據資源文檔的排序,獲取最後一個文檔數據
MongoDB聚合實例
現在假設集合studen
中有以下數據:
{ "_id" : 1, "name" : "小然", "gender" : 1, "age" : 22, "score" : 95 }
{ "_id" : 2, "name" : "小紅", "gender" : 0, "age" : 18, "score" : 80 }
{ "_id" : 3, "name" : "小亮", "gender" : 1, "age" : 19, "score" : 60 }
{ "_id" : 4, "name" : "小強", "gender" : 1, "age" : 23, "score" : 70 }
{ "_id" : 5, "name" : "小柔", "gender" : 0, "age" : 20, "score" : 85 }
{ "_id" : 6, "name" : "小雷", "gender" : 1, "age" : 25, "score" : 65 }
{ "_id" : 7, "name" : "小冉", "gender" : 0, "age" : 19, "score" : 70 }
{ "_id" : 8, "name" : "小晴", "gender" : 0, "age" : 18, "score" : 90 }
{ "_id" : 9, "name" : "小齊", "gender" : 1, "age" : 24, "score" : 50 }
- 以性別進行分組
db.students.aggregate({$group:{_id:"$gender"}})
輸出結果為:
- 統計整個文檔,獲得數據個數和平均分數
db.students.aggregate({$group:{
_id:null,
count:{$sum:1},
avg_score:{$avg:"$score"}
}})
輸出結果為:
- 以性別進行分組,獲取不同分組中數據的個數和平均分數
db.students.aggregate({$group:{
_id:"$gender",
count:{$sum:1},
avg_score:{$avg:"$score"}
}})
輸出結果為:
- 使用
$project
修改輸出結果
db.students.aggregate(
{$group:{
_id:"$gender",
count:{$sum:1},
avg_score:{$avg:"$score"}}
},
{$project:{
gender:"$_id",
count:1,
_id:0,
avg_score:"$avg_score"}
}
)
輸出結果為:
- 使用
$match
選擇分數大於等於70的學生,統計男生、女生的人數
db.students.aggregate(
{$match:{score:{$gte:70}}},
{$group:{_id:"$gender",count:{$sum:1}}},
{$project:{gender:"$_id",count:1,_id:0}}
)
輸出結果為:
MondoDB與Python的交互
pymongo的安裝
使用Python操作MongoDB需要安裝pymongo
,安裝方法很簡單,使用pip install pymongo
即可。
實例化並建立連接
首先從pymongo
中導入MongoClient
,然後實例化client
,建立連接,代碼如下:
from pymongo import MongoClient
client = MongoClient(host = "127.0.0.1",port = 27017)
#操作本機MongoDB可以寫成client = MongoClient()
collection = client["test"]["test"]
常用操作實例
- 插入一條數據
collection.insert_one({"_id":0,"name":"test0"})
- 插入多條數據
data_list = [{"_id":i,"name":"test{}".format(i)} for i in range(10)]
collection.insert_many(data_list)
data_list = [{"name":"test{}".format(i)} for i in range(10)]
collection.insert_many(data_list)
插入後結果如下圖所示,下麵的操作都在此資料庫上進行操作。
- 查詢一條記錄
print(collection.find_one({"name":"test2"}))
輸出結果為:
- 查詢所有記錄
result = collection.find({"name":"test2"})
for i in result:
print(i)
輸出結果為:
- 更新一條數據
collection.update_one({"name":"test1"},{"$set":{"name":"test10"}})
執行完操作後,資料庫如下圖所示:
- 更新全部數據
collection.update_many({"name":"test2"},{"$set":{"name":"test20"}})
執行完操作後,資料庫如下圖所示:
- 刪除一條數據
collection.delete_one({"name":"test3"})
執行完操作後,資料庫如下圖所示:
- 刪除所有滿足條件的數據
collection.delete_many({"name":"test4"})
執行完操作後,資料庫如下圖所示:
結語
- 本篇主要介紹了MongoDB的聚合操作以及與Python的交互,但對於我目前的學習階段來說,只用到了Python中的插入數據語句,其他的操作基本沒有用到。
- 感謝大家的閱讀,有錯誤希望大家能夠指出,我會積極改正。