MongoDb在搜索时出错

时间:2015-09-23 07:14:04

标签: python mongodb

我正在尝试将所有具有祖先名称的文件作为"笔记本电脑"在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
}

这里有什么不对..?感谢帮助:)

2 个答案:

答案 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,命令可以返回任何大小的结果集   光标或将结果存储到集合中。