写入Mongo时出现此错误:
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 :(得分: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."},
...
显然,这不是一个确定的答案,但它可能是一个开始。
关于在写入之前检查文档的大小(我认为这不是解决不良架构设计的好方法)。 MongoDB在内部将数据作为BSON处理,因此您可以使用bson
module:
import bson
len(bson.dumps(my_document))
如果您收到“操作员对象太大”错误,请参阅this question。
答案 1 :(得分:0)
我的文档太大了,我的架构很糟糕,显然也看到了:Mongodb update with upsert fails