PyMongo 查询数据的实现

 更新时间:2021年06月28日 10:18:57   作者:锐玩道  
本文主要介绍了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 查询数据的实现的文章就介绍到这了,更多相关PyMongo 查询数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • centos6.5安装python3.7.1之后无法使用pip的解决方案

    centos6.5安装python3.7.1之后无法使用pip的解决方案

    今天小编就为大家分享一篇关于centos6.5安装python3.7.1之后无法使用pip的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 自己使用总结Python程序代码片段

    自己使用总结Python程序代码片段

    这篇文章主要介绍了自己使用总结Python程序代码片段,本文收集了如反向读取文件、往文件中所有添加指定的前缀、匿名函数作为返回值、将二进制数转为10进制数等实用代码片段,需要的朋友可以参考下
    2015-06-06
  • Python爬取某平台短视频的方法

    Python爬取某平台短视频的方法

    这篇文章主要介绍了Python爬取某平台短视频的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • python lambda函数及三个常用的高阶函数

    python lambda函数及三个常用的高阶函数

    这篇文章主要介绍了python lambda函数及三个常用的高阶函数,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • python 中的列表生成式、生成器表达式、模块导入

    python 中的列表生成式、生成器表达式、模块导入

    这篇文章主要介绍了python中的列表生成式、生成器表达式、模块导入 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Django零基础入门之模板变量详解

    Django零基础入门之模板变量详解

    这篇文章主要介绍了Django零基础入门之模板变量详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python中Django 后台自定义表单控件

    Python中Django 后台自定义表单控件

    本篇文章主要介绍了Python中Django 后台自定义表单控件,其实 django 已经为我们提供了一些可用的表单控件,比如:多选框、单选按钮等,有兴趣的开业了解一下。
    2017-03-03
  • python操作配置文件实战记录

    python操作配置文件实战记录

    这篇文章主要给大家介绍了关于python操作配置文件的相关资料,配置文件是为程序配置参数和初始设置的文件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • PyInstaller安装包瘦身指南

    PyInstaller安装包瘦身指南

    直接pyinstaller打包的话,如果当前pip环境安装的库较多的话,会导致生成的可执行exe程序文件过大,本文详细的介绍了PyInstaller安装包瘦身的过程,感兴趣的可以了解一下
    2023-03-03
  • python的sys.path模块路径添加方式

    python的sys.path模块路径添加方式

    这篇文章主要介绍了python的sys.path模块路径添加方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03

最新评论