MongoDB 聚合查詢概述#
MongoDB 高效的文件資料庫,可以用於存儲類似於
在使用 find 查詢資料時我們可以拼接過濾條件,以返回符合條件的資料,但通常這些資料都不能直接拿來使用或傳遞,
需要後台再次加工後返回給前端應用。比如我們查詢一個用戶所有的博文就是類似的操作,通常個人資訊和博文資訊是分為兩張表進行儲存的,如果你想知道指定用戶的博文時就需要進行表關聯查詢,如果你了解關聯型資料庫,那麼就能更好的理解這種操作,因為這種表關聯查詢操作在日常開發中太常見了~
在 Mongo 中 Aggregate 命令是用於聚合查詢的方法,在不增加任何參數的情況下等同於 find 方法,他的格式如下
collection.aggregate([階段1,階段2,……,階段N])
階段指令有 用於篩選資料的 $match、用於欄位相關的 $project、用於分組的 $group、用於拆分資料的 $unwind、用於關聯表的 $lookup
篩選資料#
db.getCollection('example_user').aggregate([
{"$match":{
"name":"姜大牛",
"id":{"$lt":2}
}}
])
$match 的參數與 find 的第一個參數是一樣,可以使用欄位匹配或者使用範圍匹配
調整欄位#
db.getCollection('example_user').aggregate([
{"$project":{
"_id":0, //隱藏_id
"id":"$id", //引用自定義id
"名字":"$address", //修改欄位名稱
"work":"作家", //追加欄位
"isLogin":{"$literal":1}, //默認值為1或0
"hello":{"$literal":"$美元"} //默認值帶有$
}}
])
$project 的參數與 find 的第二個參數類似,只不過具有更多的操作可選,可以追加或修改原有欄位,也可以追加子文件的欄位。當結果中需要使用‘$’或者 1、0 作為默認值時,可以使用 $literal 進行標註,防止與 mongo 的語法衝突。
資料分組#
分組函數
db.getCollection('example_data').aggregate([
{"$group":{
"_id":"$name"
}}
])
去重函數
db.getCollection('example_data').distinct("name")
首先我們對去重函數和分組函數進行比較可以發現返回值有明顯的區別,分組返回資料每行一條,而去重返回的資料在一個數組中。如果我們需要返回更多的欄位,如分數資訊,平均值等需要統計的資料時,使用分組資訊會更適合。我們在對分組資訊進行充實一下。
db.getCollection('example_data').aggregate([{
"$group":{
"_id":"$name",
"max_score":{"$max":"$score"}, //獲取最大值
"min_score":{"$min":"$score"}, //獲取最小值
"avg_score":{"$avg":"$score"}, //獲取平均值
"sum_score":{"$sum":"$score"}, //獲取總和
"first_score":{"$first":"$score"}, //獲取第一個值
"last_score":{"$last":"$score"}, //獲取最後一個值
}
}])
拆分資料#
當資料中包含數組時,我們需要將資料拆分後在處理
db.getCollection('example_tshirt').aggregate([
{"$unwind":"$size"}
])
我們也可以拆分多個欄位
db.getCollection('example_tshirt').aggregate([
{"$unwind":"$size"},
{"$unwind":"$color"}
])
連集合查詢#
連集合查詢相當於 SQL 中的聯表查詢,通過對多個集合的資料進行整合得到我們需要的資料,格式如下
主集合.aggregate([
{"$lookup":{
"from":"關聯集合",
"localField":"主集合欄位",
"foreignField":"關聯集合欄位",
"as":"關聯集別名"
}}
])
比如我們需要查詢用戶都寫了哪些博文就可以按照如下的格式寫
當然這種資料格式對於我們來說還不夠,我們可以對資料進行優化
另外#
搞完 mongo 肯定是需要拿來用的,在 python 中有個 pymongo 庫,幾乎可以將 mongo 指令直接拿來用,這樣減少了我們的學習成本,相當給力
更多內容點我