中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyMongo如何查詢數據

發布時間:2021-06-28 11:39:28 來源:億速云 閱讀:394 作者:小新 欄目:開發技術

這篇文章主要介紹PyMongo如何查詢數據,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

查詢數據

mongodb存儲的所有數據,都是為了需要讀取的時候能夠取出。
但讀取除了按某一列比如分數: 排序 讀取;還會出現我只看某一段時間、某個班的條件篩選;還會出現我想看每個班平均分 聚合 求平均....等等多樣操作
這些操作都可以通過 find_one()、find() 完成:

ret2find = collect.find_one()
# {'_id': ObjectId('5ea780bf747e3e128470e485'), 'class_name': '高三(1)班', 'student_name': '張三', 'subject': '英語', 'score': 100, 'date': '20200301'}

ret2find = collect.find()
# <pymongo.cursor.Cursor object at 0x0000024BBEBE15C8>

從上面的結果可以看出,find_one() 查詢得出單一字典;find()則是一個生成器對象能夠通過 for val in ret2find: 遍歷取出

設置查詢條件

但能取出全部數據還不夠,查詢一般是會帶條件、甚至復雜的條件 —— 比如:查詢出 高三(1)班,張三 或 李四,成績大于90 的科目,該怎么做呢?

ret2find = collect.find({"class_name":"高三(1)班","score":{"$gt":90},"$or":[{"student_name":"張三"},{"student_name":"李四"}]})

for val in ret2find:
    print(val)

上面有兩個要點:

{"class_name":"高三(1)班","score":{"$gt":90}}

這一段 寫法 表示 “高三(1)班 且 分數 > 90”;
而 $gt 比較操作符,表 大于意思,除 $gt 操作符以外還有:

符號含義
$lt小于
$lte小于等于
$gt大于
$gte大于等于
$ne不等于
$in在范圍內
$nin不在范圍內

{"$or":[{"student_name":"張三"},{"student_name":"李四"}]}

這一段 寫法 表示 “學生名稱為 張三 或 李四”
而其中的 $or 邏輯操作符,用它來表示條件之間的關系。除了 $or 以外的邏輯操作符還有:

符號含義
$and按條件取 交集
$not單個條件的 相反集合
$nor多個條件的 相反集合
$or多個條件的 并集

更多查詢操作

除了上述常規操作外,具體使用場景中我們還會用到:

符號含義示例示例含義
$regex正則匹配{"student_name":{"regex":".?三"}}學生名以 “三” 結尾
$expr允許查詢中使用 聚合表達式{"expr":{"gt":["spent","budget"]}}查詢 花費 大于 預算 的超支記錄
$exists屬性是否存在{"date":{"$exists": True}}date屬性存在
$exists屬性是否存在{"date":{"$exists": True}}date屬性存在
$type類型判斷{"score":{"$type":"int"}}score的類型為int
$mod取模操作{'score': {'$mod': [5, 0]}}分數取5、0的模

更多 查詢操作符 可以點擊 查看官方文檔

PS:pymongo最大查詢限制

在用pyhton遍歷mongo數據中時候,發限查詢到101行就會阻塞,如下

lista_a = []
    for info in db.get_collection("dbs").find():
        lista_a.append(info)
        print("info nums=",len(info))

'''結果顯示'''
'''info nums=101'''

分析原因:mongodb的find()方法返回游標cursor,可能有一個限制閾值101,參考文檔,如下

原文:

The MongoDB server returns the query results in batches. The amount of data in the batch will not exceed the maximum BSON document size. To override the default size of the batch, see batchSize() and limit().

New in version 3.4: Operations of type find(), aggregate(), listIndexes, and listCollections return a maximum of 16 megabytes per batch. batchSize() can enforce a smaller limit, but not a larger one.

find() and aggregate() operations have an initial batch size of 101 documents by default. Subsequent getMore operations issued against the resulting cursor have no default batch size, so they are limited only by the 16 megabyte message size.

For queries that include a sort operation without an index, the server must load all the documents in memory to perform the sort before returning any results.

翻譯:

MongoDB服務器批量返回查詢結果。批處理中的數據量不會超過最大BSON文檔大小。要覆蓋批處理的默認大小,請參見batchSize()和limit()。
新版本3.4:類型為find()、aggregate()、listIndexes和listCollections的操作每批最多返回16兆字節。batchSize()可以執行較小的限制,但不能執行較大的限制。
find()和aggregate()操作的初始批處理大小默認為101個文檔。針對生成的游標發出的后續getMore操作沒有默認的批處理大小,因此它們僅受16mb消息大小的限制。 對于包含沒有索引的排序操作的查詢,服務器必須在返回任何結果之前加載內存中的所有文檔來執行排序。

解決方案

lista_a = []
    for info in db.get_collection("dbs").find().batch_size1(5000): #修改最大限制閾
        lista_a.append(info)
        print("info nums=",len(info))

但是這種方法是每次游標返回5000條數據,循環遍歷,如果單詞查找50000次應該怎么寫呢?如下

   lista_a = []
   cousor=db.get_collection("dbs").find().batch_size1(5000)
    for i in range(50000): #修改最大限制閾
        lista_a.append(next(cousor))

以上是“PyMongo如何查詢數據”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彝良县| 金湖县| 栖霞市| 绥滨县| 阿克苏市| 滕州市| 泗洪县| 获嘉县| 越西县| 新宁县| 安阳市| 海伦市| 鸡泽县| 石河子市| 绥阳县| 呼玛县| 旬邑县| 华池县| 聂拉木县| 凤翔县| 宿迁市| 永德县| 绵阳市| 抚顺县| 镇远县| 环江| 锡林郭勒盟| 岑巩县| 南川市| 历史| 东海县| 黔江区| 河源市| 财经| 上思县| 西乌珠穆沁旗| 彭州市| 贵溪市| 南昌县| 肇州县| 鄄城县|