- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PyMongo 查询数据的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
往 mongodb存储的所有数据,都是为了需要读取的时候能够取出。 但读取除了按某一列比如分数: 排序 读取;还会出现我只看某一段时间、某个班的条件筛选;还会出现我想看每个班平均分 聚合 求平均....等等多样操作 这些操作都可以通过 find_one()、find() 完成:
1
2
3
4
5
|
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 的科目,该怎么做呢?
1
2
3
4
|
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的模 |
。
更多 查询操作符 可以点击 查看官方文档 。
在用pyhton遍历mongo数据中时候,发限查询到101行就会阻塞,如下 。
1
2
3
4
5
6
7
|
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消息大小的限制。 对于包含没有索引的排序操作的查询,服务器必须在返回任何结果之前加载内存中的所有文档来执行排序.
1
2
3
4
|
lista_a
=
[]
for
info
in
db.get_collection(
"dbs"
).find().batch_size1(
5000
):
#修改最大限制阈
lista_a.append(info)
print
(
"info nums="
,
len
(info))
|
但是这种方法是每次游标返回5000条数据,循环遍历,如果单词查找50000次应该怎么写呢?如下 。
1
2
3
4
|
lista_a
=
[]
cousor
=
db.get_collection(
"dbs"
).find().batch_size1(
5000
)
for
i
in
range
(
50000
):
#修改最大限制阈
lista_a.append(
next
(cousor))
|
到此这篇关于PyMongo 查询数据的实现的文章就介绍到这了,更多相关PyMongo 查询数据内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/6978511249672208392 。
最后此篇关于PyMongo 查询数据的实现的文章就讲到这里了,如果你想了解更多关于PyMongo 查询数据的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试扩展我的第一个 Flask 应用程序,但不了解在多个模块中使用 pymongo 数据库所需的结构。例如,这是我的新结构: run.py app/ ├── __init__.py ├── fo
Pymongo 返回一个游标,我可以迭代结果并将其文档附加到列表中。有没有办法直接获取列表中的结果文档?谢谢 最佳答案 以下代码会将整个结果集(光标)转换为列表: myresults = list(m
我使用pip3成功安装了pymongo Aleeshas-MacBook-Air:project 2 aleesha$ sudo pip3 install pymongo The directory
我正在尝试运行非常简单的代码来弄清楚如何将 pymongo 与 MongoDB Atlas Cloud 结合使用。 这是示例代码 import pymongo client = pymongo.Mon
我想找到集合 (mycol) 中的文档的 _id,其中 "name":"John"。我已插入文档,但想找到文档的 _id。可能吗 ?我正在尝试 result = db.mycol.find({"_id
我是 PyMongo 和 Flask 的新手,不过我已经完成了 Flask 的教程,并且对它感觉很舒服。我现在正在尝试使用 MongoDb 实现 flask 服务器,但我不确定如何进行。 我看到有两个
我正在尝试在 mongodb 集合中批量插入一些文档。 我对我收藏的链接字段施加了唯一约束。 bulkUrls = db.urls.initialize_ordered_bulk_op() for i
简单介绍一下背景知识,我之前曾在 Node.js 和 mongoose.js 中使用过 MongoDB。现在我决定尝试使用 python 和 pymongo。但是,当我尝试将文档插入到我的集合中时,我
我正在获取 MongoDB 中某个集合的全部数据,一段时间后(比如 30 或 60 分钟),脚本会引发以下错误: pymongo.errors.CursorNotFound: cursor id 18
我在 mongodb 数据库中消费了一堆推文。我想使用 pymongo 查询这些推文。例如,我想查询 screen_name。但是,当我尝试这样做时,python 不会返回推文,而是返回有关 pymo
我有一个 合作伙伴集合,我正在使用 pymongo 来检索数据 当我使用 MongoDB 查询集合时,我看到以下结果 db.partner.find({'unique_key': 'c89dbe313
我正在尝试使用 Pymongo 将字典插入到 MongoDB 集合中。代码段为 newdict = {'id': a, 'usr_id': i.get('user_id'), 'reach_value
我尝试使用 pymongo 连接 MongoDB。但是遇到了dnspython必须安装的错误即使在我安装了 pymongo 和 dnspython 之后。 我的代码是: import pymongo
我正在使用 pymongo 将数亿条格式为 {'id_str': , 'created_at': , 'text': } 的推文从文本文件迁移到 MongoDB。为每个用户创建一个集合来存储他/她的推
我知道这是一个相当普遍的问题。我正在编写一个小型 Flask 应用程序,并试图将一些查询反馈给 View 。 我已经连接到我的本地 MongoDB 设置,并进行了成功的查询 - 但我无法用它生成 js
我想从 ObjectId 对象中获取字符串字符。我用的是pymongo。例如:ObjectId("543b591d91b9e510a06a42e2"),我想获取"543b591d91b9e510a06
我想实现一个函数,该函数需要以与插入相反的顺序从 pymongo 集合中获取值。 我可以想到几个方法: cursor = collection.find(skip=collection.count()
从pymongo文档: MongoDB以BSON格式存储数据。 BSON字符串采用UTF-8编码,因此PyMongo必须确保 它存储的任何字符串仅包含有效的UTF-8数据。常规字符串()>已验证,并且
目录 查询数据 设置查询条件 更多查询操作 PS:pymongo最大查询限制 解决方案 查询数据 往
修订问题。将很快更新。 最佳答案 演示 - https://mongoplayground.net/p/ksay82IaGHs 按 TeacherID 分组和 TeacherID并获得组合的出现,$s
我是一名优秀的程序员,十分优秀!