2015-02-09 37 views
0

写蒙戈当我得到这个错误:MongoDB的,Python和PyMongo:文档大小与BSONObj尺寸过大是无效

OperationalFailure caught 
10334 
{u'connectionId': 2365, u'code': 10334, u'ok': 1.0, u'err': u'BSONObj size: 17254820 (0xA4490701) is invalid. Size must be between 0 and 16793600(16MB) First element: 0: 

这是一个正常的文件全字符串和整数的,在Python构造,但它的大小似乎是17,25MB。你会怎么做?

这是数据看起来的样子:

{ date: new Date(1417996800000), 
    visitors: [ { owner: "AS3320 Deutsche Telekom AG", ip: "82.148.15.23", views: 844 }, 
       { owner: "AS29314 VECTRA S.A.", ip: "173.235.42.25", views: 458 }, 
       ... 
      ] 
} 

有数组中很多很多的元素,但我很奇怪的量超过16MB。

限制数组的大小降到8500元后,我得到这个PyMongo错误:

$ operator made object too large 
+0

你可以正常化一点吗?也许80%的数据在20%的字段中。然后你可以将其中的几个移动到他们自己的收藏中。 – 2015-02-09 13:16:50

+0

我更新了我的问题以适合您的问题。拥有所有页面印象将会很好,但是可以想象当数组超过一定长度或大小时就可以切割数组。使用GridFS似乎很复杂? – nottinhill 2015-02-09 13:25:03

+0

在写入Mongo之前,有没有办法确定python或json对象中列表的物理大小? – nottinhill 2015-02-09 13:50:13

回答

2

在设计Mongo模式时有很多事情需要考虑,但通常架构应该反映您如何使用数据。 MongoDB博客上的6 Rules of Thumb for MongoDB Schema Design文章系列是一个好的开始。

我首先想到的是把你的文件“内而外”,并存储这种类型的文档集合中:

{ date: new Date(1417996800000), owner: "AS3320 Deutsche Telekom AG", ip: "82.148.15.23", views: 844 }, 
{ date: new Date(1417996800000), owner: "AS29314 VECTRA S.A.", ip: "173.235.42.25", views: 458 }, 
... 

这样,你不限制多少独立用户,每天可以有。如果您在date字段上编制索引,则通过日期查找访问者仍然有效。

如果您没有使用owner字段,也许它也可以移到自己的集合中。

{ ip: "82.148.15.23", owner: "AS3320 Deutsche Telekom AG"}, 
{ ip: "173.235.42.25", owner: "AS29314 VECTRA S.A."}, 
... 

显然不是一个明确的答案,但它可能是一个开始。

关于在编写文档之前检查文档的大小(我认为这不是解决糟糕的模式设计的好方法)。数据为BSON通过MongoDB的内部处理的,所以你可以使用bson module

import bson 
len(bson.dumps(my_document)) 

如果你得到了“操作者进行对象过大”的错误,请参阅this question

+2

Apreciate它。这是大数据,所以我采用更平坦的模式。 – nottinhill 2015-02-10 20:35:24