【问题标题】:Can't replace mongo document无法替换 mongo 文档
【发布时间】:2014-09-27 12:49:35
【问题描述】:

我正在尝试将文档保存到 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 的限制。

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

【问题讨论】:

  • 我假设您忽略了代码清单中的修改。请张贴他们
  • @MarkusWMahlberg:不,我没有。在我的调试过程中,我已经将问题逐字简化为上述代码。当我不以任何方式修改数据时,就会出现问题——这就是我被难住的原因。

标签: pymongo tokumx


【解决方案1】:

显然这是带有 TokuMX 的known issue。 Oplog 条目是文档大小的两倍,因此替换 9mb 的文档将导致 18mb 的 oplog 条目——这会引发异常。

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

【讨论】:

    【解决方案2】:

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

    如果文档有_id,那么在后台,save(doc) 就会变成 update(doc, doc)。这就是加倍发挥作用的地方,因为查询+更新是 18MB。

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

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

    HTH, 抢。

    【讨论】:

    • 好主意 - 不幸的是 db.collection.update({'_id': doc['_id']}, doc) 导致同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多