pymongo中group by的操作方法教程
前言
使用 pymongo 進行 group by 操作有兩種基本方式,他們都是 mongodb 的原生命令,于 Collection 對象上調用。
def aggregate(self, pipeline, **kwargs): def group(self, key, condition, initial, reduce, finalize=None, **kwargs):
示例數(shù)據(jù)
演示用的數(shù)據(jù)為一個訂單表,含有以下字段:
Order
_id: ObjectID
userid: int
itemid: int
amount: int
time: string
主要任務為:
- 統(tǒng)計某個時間區(qū)間內每個 userid 的訂單數(shù)
- 統(tǒng)計某個時間區(qū)間內每組 (userid, itemid) 共售出多少 amount
即分別為:單鍵分組和多鍵分組
aggregate
聚合操作只接受一個列表類型的參數(shù) —— pipeline。其每一個元素都是一步操作(stage)。全部可用的 stage 可參見:
https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#stages
注意 pipline 里面的 stage 是有序且可重復的,mongodb 會順序執(zhí)行,因此一定要記得把像 $match 這樣的 stage 放前面。
單鍵分組
start_time = '2010-10-10 00:00:00'
end_time = '2010-10-10 23:59:59'
match = {
'time': {
'$gte': start_time,
'$lte': end_time,
}
}
groupby = 'userid'
group = {
'_id': "$%s" % (groupby if groupby else None),
'count': {'$sum': 1}
}
ret = collection.aggregate(
[
{'$match': match},
{'$group': group},
]
)
>>> ret
[{'_id': 123, 'count': 500}, ...]
$group 指定了返回數(shù)據(jù)的格式,其中 _id 字段是分組的鍵。
多鍵分組
groupby = ['itemid', 'userid']
group = {
'_id': {key: ('$%s' % key) for key in groupby} or {'None': '$None'},
'count': {'$sum': '$amount'}
}
ret = collection.aggregate(
[
{'$match': match},
{'$group': group},
]
)
>>> ret
[{'_id': {'itemid': 111, 'user_id': 123}, 'count': 100}, ...]
這里與單鍵分組的區(qū)別僅在于 _id 的類型,改成了一個字典,從而允許多鍵組合。
為了提高通用性,建議始終使用字典的格式。
另外,既然字符串和字典都可以做鍵,那么列表行不行呢?答案是不行,列表里的元素,(如 '$userid') 并不會被自動識別為字段,而是僅作一般字符串處理。
最后關于 aggregate 中可用的運算操作符,可參見:
https://docs.mongodb.com/manual/reference/operator/aggregation/#accumulators
如其中的 $addToSet 也是頗有用處,可以用來實現(xiàn) “統(tǒng)計每個人都買過哪些 itemid” 這樣的功能:
group = {
'_id': {'userid': '$userid'},
'dist_itemids': {'$addToSet': '$itemid'},
}
group
相較于 aggregate 的全能,group 是專門處理分組操作的一個命令,因此這個方法的參數(shù)也更明確,主要參數(shù)為:
- key list, 分組的鍵
- condition dict,過濾條件
- initial dict,初始值
- reduce string/bson.Code, js 的 reduce 函數(shù)
例:
key = ['userid', 'itemid']
condition = {
'time': {
'$gte': start_time,
'$lte': end_time,
}
}
initial = {'count': 0}
reducer = Code("""
function(obj, prev) {
prev.count = prev.count + obj.amount
}
""")
ret = collection.group(key, condition, initial, reducer)
>>> ret
[{'userid': 110, 'itemid': 123, 'count': 500.0}, ...]
這里的分組數(shù)據(jù)聚合,是通過 reduce 函數(shù)實現(xiàn)的,這個函數(shù)與 python 的 reduce 不同,它不需要返回值,而是直接修改 prev 參數(shù)即可,這個參數(shù)會自動代入下一次調用。這可能是 js 的實現(xiàn)。
須注意的是 js 默認返回浮點數(shù)。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
python執(zhí)行l(wèi)inux系統(tǒng)命令的三種方式小結
本文介紹三種在python執(zhí)行l(wèi)inux命令的方式,三種方式都是基于python的標準庫實現(xiàn),因此不需要額外安裝第三方庫,具有一定的參考價值,感興趣的可以了解一下2024-02-02
15行Python代碼實現(xiàn)網(wǎng)易云熱門歌單實例教程
這篇文章主要給大家介紹了關于利用15行Python代碼實現(xiàn)網(wǎng)易云熱門歌單的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-03-03
Python 統(tǒng)計列表中重復元素的個數(shù)并返回其索引值的實現(xiàn)方法
這篇文章主要介紹了Python 統(tǒng)計列表中重復元素的個數(shù)并返回其索引值,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
jupyter中torch庫的安裝與虛擬環(huán)境的搭建方式
本文詳細介紹了如何在Windows系統(tǒng)上創(chuàng)建和配置PyTorch環(huán)境,包括安裝Anaconda、創(chuàng)建虛擬環(huán)境、配置鏡像源、安裝CUDA、查找和安裝PyTorch版本、安裝ipykernel以及在Jupyter Notebook中切換環(huán)境2025-02-02
Python結合Selenium簡單實現(xiàn)Web自動化測試
這篇文章是入門級別的應用Python + Selenium進行自動化測試,包括環(huán)境搭建及簡單的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

