pymongo.errors.DocumentTooLarge: ‘aggregate‘ command document too large 解决

文章讲述了在处理MongoDB聚合查询时遇到16MB文档大小限制的问题。作者通过转换思路,避免了直接增加内存配置的解决方案,而是采用了分页聚合的方法来统计不在MySQL中的订单数量和电量,成功解决了DocumentTooLarge的错误。此外,还讨论了使用字典哈希判断的优化提议,但考虑到大量数据循环处理的效率问题,最终选择了分页聚合策略。
摘要由CSDN通过智能技术生成

先说明:本文没有介绍直接快速的方式(例如:加个参数,改个配置等),而是通过转换思路解决的,介意勿看!

最近在使用mongo做聚合统计的时候遇到的问题,经过一通查询,知道mongdb和pymongo16MB有文档大小限制。之前只知道mongo有一条document文档会有16MB的限制,这次聚合match查询条件里的list大小也报了超限!

需求:有个mysql订单库和mongo订单库,mongo里存的订单包含mysql存的订单,目标是统计在mongo里不在mysql里的订单的电量和订单数!

之前的代码:

filter_pipe = {"StartType": 3, 
               "EndTime": {"$lte": end_date, "$gte": start_date}, 
               "OrderID": {"$nin": all_mysql_orders}}
ret = db.get_collection("table_name").aggregate([
                    {"$match": filter_pipe},
                    {"$group": {"_id": {}, "totalPower": {"$sum": "$TotalPower"}, "count": {"$sum": 1}}}
                    ])

all_mysql_orders 有24MB,超限报了错&#x

这个错误通常是因为你的 MongoDB 数据库没有授权给你的 Python 程序或用户帐户。 要解决这个问题,你需要确保在连接 MongoDB 数据库时提供了正确的数据库用户名和密码。你可以使用以下代码来连接 MongoDB 数据库: ``` import pymongo myclient = pymongo.MongoClient("mongodb://username:password@localhost:27017/") mydb = myclient["test"] ``` 在这里,"username" 和 "password" 是你的 MongoDB 数据库用户名和密码,"localhost" 是你的 MongoDB 服务器地址,"27017" 是 MongoDB 的默认端口号,"test" 是你的数据库名称。 如果你已经提供了正确的用户名和密码,但是仍然无法连接 MongoDB 数据库,则需要检查你的 MongoDB 数据库是否已经授权给你的用户帐户。你可以通过以下命令来授权: ``` use admin db.createUser( { user: "username", pwd: "password", roles: [ { role: "root", db: "admin" } ] } ) ``` 在这里,"username" 和 "password" 是你要授权的用户名和密码,"roles" 是你要授予该用户的角色。在这个例子中,我们将该用户授予 "root" 角色,这个角色拥有最高的权限,可以执行任何操作。 如果你已经正确授权了用户帐户,但仍然无法连接 MongoDB 数据库,则需要检查你的 MongoDB 数据库是否已经启用了身份验证。如果身份验证已经启用,你需要在连接 MongoDB 数据库时提供身份验证信息,如下所示: ``` import pymongo myclient = pymongo.MongoClient("mongodb://username:password@localhost:27017/", authSource="admin") mydb = myclient["test"] ``` 在这里,"authSource" 参数指定了你的身份验证数据库名称。在这个例子中,我们将身份验证数据库设置为 "admin"。 希望这些信息对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值