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网络编程示例(客户端与服务端)
Apr 24 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
Python检测网络延迟的代码
May 15 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
python列表使用实现名字管理系统
Jan 30 Python
Django自定义用户登录认证示例代码
Jun 30 Python
python搜索算法原理及实例讲解
Nov 18 Python
python中的unittest框架实例详解
Feb 05 Python
python实现过滤敏感词
May 08 Python
浅谈哪个Python库才最适合做数据可视化
总结Python变量的相关知识
详解非极大值抑制算法之Python实现
Python实现生活常识解答机器人
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Python移位密码、仿射变换解密实例代码
Pytest中conftest.py的用法
You might like
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
python二分法实现实例
2013/11/21 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python tkinter组件摆放方式详解
2019/09/16 Python
python实现简易学生信息管理系统
2020/04/05 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
2014年销售经理工作总结
2014/12/01 职场文书
趣味运动会开幕词
2015/01/28 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python