python-pymongo常用查詢方法含聚合問題
普通查詢
按照所需字段排序
db_set.find().sort("field_name ",pymongo.ASCENDING) --升序 db_set.find().sort("field_name ",pymongo.DESCENDING) --降序
查詢數據庫表的全部內容
# 第一種: db_set.find({}) #第二種: db_set.find()
精確查詢
db_set.find({“field_name”:”value”}) db_set.find({“field_name”:”value”, “field_name”:”value”})
只返回所需要的字段信息
find的第二參數可以幫助我們只把需要的鍵值信息返回,需要將我們需要的鍵指定為1,另外默認的”_id”默認是返回的,我們不需要它返回的話將它的值設為0
db_set.find({}, {“field_name_one”:1, “field_name_two”:1,”_id”:0})
比較查詢
首先 $lt和<,$lte和<=,$gt和>,gte和>=,ne和!=是一一對應的
db_set.find({"field_name": {"$lt": value, "$gt": value}})
關聯(lián)查詢
如果只想查詢一個鍵的多個值,或取除某個值之外所有的數據那么就用到了, $in和$nin
#比如我只想獲取field_name為1,5,8的數據: db_set.find({"field_name": {"$in": [1,5,8]}}) #如果想獲取field_name為5之外的所有數據: db_set.find({"field_name": {"$nin": [5]}})
多條件模糊查詢
$regex為模糊查詢的字符串提供正則表達式功能
db_set.find({"$or": [{"field_name": {'$regex': value}},{"field_name": {'$regex': value}}]})
聚合
語法格式:db.集合名稱.aggregate([{管道:{表達式}}])
list_a = list(ROLE_TREE.aggregate([ {"$group": { "_id": '$update_time', # 我想查詢的字段 "counter": {"$sum": 1} # 產生的數量 } } ])) print(list_a) res= [{'_id': 1649238526, 'counter': 1}, {'_id': 1649405332, 'counter': 1}, {'_id': 1649405568, 'counter': 1}, {'_id': 1649237591, 'counter': 1}, {'_id': 1649237314, 'counter': 1}, {'_id': 1649405347, 'counter': 1}]
常用管道
$group
:將集合中的文檔分組,可用于統(tǒng)計結果$match
:過濾數據,只輸出符合條件的文檔$project
:修改輸入文檔的結構,如重命名、增加、刪除字段、創(chuàng)建計算結果$sort
:將輸入文檔排序后輸出$limit
:限制聚合管道返回的文檔數$skip
:跳過指定數量的文檔,并返回余下的文檔
常用表達式
$sum
:計算總和,$sum:1同count表示計數$avg
:計算平均值$min
:獲取最小值$max
:獲取最大值$push
:在結果文檔中插入值到一個數組中$first
:根據資源文檔的排序獲取第一個文檔數據$last
:根據資源文檔的排序獲取最后一個文檔數據
$group
將集合中的文檔分組,可用于統(tǒng)計結果 ,_id表示分組的依據,使用某個字段的格式為’$字段’
list(ROLE_TREE.aggregate([ {"$group": { "_id": '$update_time', # 我想查詢的字段 "counter": {"$sum": 1} # 產生的數量 } } ])) # "counter"為自定義名稱,用來存儲結果的變量
Group by null:將集合中所有文檔分為一組
list_a = list(ROLE_TREE.aggregate([ {"$group": { "_id": None, # 為空 "counter": {"$sum": 1} # 產生的數量 } } ])) res = [{'_id': None, 'counter': 6}]
$match
用于過濾數據,只輸出符合條件的文檔,使用MongoDB的標準查詢操作
list_a = list(ROLE_TREE.aggregate([ {'$match': {'update_time': {'$lt': int(time.time())}}}, # 查找 {'$group': {'_id': '$update_time', 'counter': {'$sum': 1}}} # 分組 ])) res= [{'_id': 1649405332, 'counter': 1}, {'_id': 1649405347, 'counter': 1}, {'_id': 1649237314, 'counter': 1}, {'_id': 1649237591, 'counter': 1}, {'_id': 1649405568, 'counter': 1}, {'_id': 1649238526, 'counter': 1}] # --------------------------------- list_a = list(ROLE_TREE.aggregate([ {'$match': {'update_time': int(time.time())}}, # 查找 # {'$group': {'_id': '$update_time', 'counter': {'$sum': 1}}} # 分組 ])) res = []
$project
修改輸入文檔的結構,如重命名、增加、刪除字段、創(chuàng)建計算結果(類似查找中投影,值為1表示顯示,值為0不顯示)
list_a = list(ROLE_TREE.aggregate([ {"$project": {"_id": 1, "create_time": 1, 'org_id': 1}}, # _id 一定在前 {'$group': {'_id': '$create_time', 'counter': {'$sum': 1}}} # 分組 ])) res = [{'_id': 1649237314, 'counter': 1}, {'_id': 1649405347, 'counter': 1}, {'_id': 1649405568, 'counter': 1}, {'_id': 1649238526, 'counter': 1}, {'_id': 1649405332, 'counter': 1}, {'_id': 1649237591, 'counter': 1}]
$sort
將輸入文檔排序后輸出 ,1 升序 -1降序
list_a = list(ROLE_TREE.aggregate([ {'$sort': {'update_time': 1}}, {"$project": {"_id": 0, 'update_time': 1}} ])) res = [{'update_time': 1649237314}, {'update_time': 1649237591}, {'update_time': 1649238526}, {'update_time': 1649405332}, {'update_time': 1649405347}, {'update_time': 1649405568}]
$limit
限制聚合管道返回的文檔數
list_a = list(ROLE_TREE.aggregate([ {"$limit": 2}, {"$project": {'_id': 1}} ])) res= [{'_id': '8796e0d2a75ee0d84c1fbcb5ac4e7cc5'}, {'_id': 'bbd7664aa4b1d7fbfaa0256b05a78fd1'}]
$skip
跳過指定數量的文檔,并返回余下的文檔
list_a = list(ROLE_TREE.aggregate([ {"$skip": 3}, # 跳過 {"$project": {'_id': 1}} ])) res = [{'_id': '26702db7682ef817047b9681cd685987'}, {'_id': 'b64f271c735c8a57b34a0feefd292d65'}, {'_id': '5974aaaf7848fd8af6426cad375c4b62'}]
先寫skip,再寫limit
list_a = list(ROLE_TREE.aggregate([ {"$skip": 1}, # 跳過 {"$limit": 1}, # 分組數量 {"$project": {'_id': 1}} ])) res = [{'_id': 'bbd7664aa4b1d7fbfaa0256b05a78fd1'}]
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何基于Python代碼實現(xiàn)高精度免費OCR工具
這篇文章主要介紹了如何基于Python代碼實現(xiàn)高精度免費OCR工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-065個Python使用F-String進行格式化的實用技巧分享
F-String(格式化字符串字面值)是在Python?3.6中引入的,它是一種非常強大且靈活的字符串格式化方法,本文總結了5個實用的F-String技巧,相信一定能讓你的代碼輸出更加的美觀,快跟隨小編一起學習起來吧2024-03-03