PyMongo 查询数据的实现


Posted in Python onJune 28, 2021

查询数据

往 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 查询数据的实现的文章就介绍到这了,更多相关PyMongo 查询数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python跳出循环语句continue与break的区别
Aug 25 Python
Python迭代器和生成器介绍
Mar 06 Python
用Python制作简单的钢琴程序的教程
Apr 01 Python
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
Oct 13 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
python matplotlib拟合直线的实现
Nov 19 Python
Django模板获取field的verbose_name实例
May 19 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 Python
浅谈哪个Python库才最适合做数据可视化
总结Python变量的相关知识
详解非极大值抑制算法之Python实现
Python实现生活常识解答机器人
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Python移位密码、仿射变换解密实例代码
Pytest中conftest.py的用法
You might like
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
PHP多进程编程实例详解
2017/07/19 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
vue组件watch属性实例讲解
2017/11/07 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
Python闭包思想与用法浅析
2018/12/27 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
联强国际笔试题面试题
2013/07/10 面试题
寒假思想汇报
2014/01/10 职场文书
甜点店创业计划书
2014/01/27 职场文书
投标承诺书范本
2014/03/27 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
生物科学专业自荐书
2014/06/20 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
简单的辞职信模板
2015/05/12 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python