我正在尝试将所有具有祖先名称的文件作为"笔记本电脑"在pymongo的帮助下,在python中使用以下代码行。
for p in collection.find({"ancestors.name":"Laptops"}):
print p
但我收到了这个错误。
pymongo.errors.OperationFailure: database error: BSONObj size: 536871080 (0x200000A8) is invalid. Size must be between 0 and 16793600(16MB) First element: seourl: "https://example.com"
如果我将查询限制为
for p in collection.find({"ancestors.name":"Laptops"}).limit(5):
print p
然后它有效。所以我想问题是在获取此类别的所有文档时。如何解决这个问题呢?我想要所有的文件与#34;笔记本电脑"。
修改: -
使用聚合管道概念我尝试了以下查询
db.product_attributes.aggregate([
{
$match:
{
"ancestors.name":"Laptops"
}
}
])
我得到了同样的错误
uncaught exception: aggregate failed: {
"errmsg" : "exception: BSONObj size: 536871080 (0x200000A8) is invalid. Size must be between 0 and 16793600(16MB) First element: seourl: \"https://example.com"",
"code" : 10334,
"ok" : 0
}
这里有什么不对..?感谢帮助:)
答案 0 :(得分:1)
查询返回的文档的最大大小为16MB。您可以在official document
上看到该限制和其他限制为了解决这个问题,您可以计算记录总数并循环记录并打印出来
<强>示例:强>
count=db.collection.count({"ancestors.name":"Laptops"})
for num in range (0,count,500):
if num!=0:
for p in collection.find({"ancestors.name":"Laptops"}).skip(num-1).limit(500):
print p
else:
for p in collection.find({"ancestors.name":"Laptops"}).limit(500):
print p
警告:强>
此方法很慢,因为您跳过并限制记录
答案 1 :(得分:1)
创建限制是为了不允许您的mongoDB进程在服务器上消耗所有内存。要了解更多信息 - 这里的ticket约为4&gt; 16 MB限制增加,并讨论它的目的。
替代方法是使用Aggregation pipeline
如果aggregate命令返回包含的单个文档 完整的结果集,如果结果该命令将产生错误 set超过BSON Document Size限制,当前为16 兆字节。要管理超过此限制的结果集,请使用聚合 如果命令返回a,命令可以返回任何大小的结果集 光标或将结果存储到集合中。