0

我正在尝试将文档保存到 mongoDB 集群(分片副本集)并且遇到了一个奇怪的问题。我正在使用 pymongo 2.7.2 和 TokuMX 1.5 mongodb 2.4.10。

当我尝试保存(覆盖)现有文档时,我收到一个异常,看起来我保存的文档太大:

doc = db.collection.find_one()
db.collection.save(doc)

pymongo.errors.OperationFailure: BSONObj size: 18798961 (0x71D91E01) is invalid. Size must be between 0 and 16793600(16MB) First element: op: "u"

但是,这很好用:

doc = db.collection.find_one()
db.collection.remove({'_id': doc['_id']})
db.collection.save(doc)

有问题的文档大约是 9mb,所以当我尝试替换文档时,它看起来像是文档大小的两倍,超过了 16mb 的限制。

关于什么可能导致这种行为的任何想法?

4

2 回答 2

1

显然这是TokuMX的一个已知问题。Oplog 条目是文档大小的两倍,因此替换 9mb 的文档将导致 18mb 的 oplog 条目——这会引发异常。

解决方案是将文档写入限制为小于 8mb,以便 oplog 条目永远不会超过 16mb。

于 2014-08-07T16:40:29.270 回答
0

我认为这是在 PyMongo 中实现 save 的副作用。

如果文档有一个_id然后保存(文档)变成一个更新(文档,文档)。这就是加倍发挥作用的地方,因为查询+更新是 18MB。

当您删除 _id 时,您将 save(doc) 更改为带有 new 的文档的 insert(doc) _id。我不认为那是你想要的。

我建议不要使用保存,而是仅使用_id原始文档中的字段构建查询并手动执行更新调用。我什至会去你应该输入一张Jira票让 PyMongo 为你做这件事。

HTH,罗布。

于 2014-08-05T05:08:14.127 回答