Не могу заменить документ монго

Я пытаюсь сохранить документы в кластере 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)

Документ, о котором идет речь, составляет около 9 МБ, поэтому, похоже, что когда я пытаюсь заменить документ, он как-то удваивает размер документа, превышая предел в 16 МБ.

Есть идеи относительно того, что может вызвать такое поведение?

2 ответа

Решение

По-видимому, это известная проблема с TokuMX. Записи оплога в два раза больше документа, поэтому замена документа на 9 Мб приведет к записи опла на 18 Мб, что вызывает исключение.

Решение состоит в том, чтобы ограничить количество записей в документе менее 8 МБ, чтобы записи в журнале никогда не превышали 16 МБ.

Я думаю, что это побочный эффект от того, как сохранение реализовано в PyMongo.

Под капотом, если документ имеет _id затем сохранение (документ) превращается в обновление (документ, документ). Вот где удвоение вступает в игру, так как запрос + обновление составляет 18 МБ.

Когда вы удалили _id, вы изменили сохранение (doc) на вставку (doc) нового документа с новым _id, Я не думаю, что это то, что вы хотели.

Вместо использования save я бы порекомендовал построить запрос только с _id поле из исходного документа и сделать обновление вызова вручную. Я бы даже зашел так далеко, что вы должны ввести билет Jira, чтобы PyMongo сделал это для вас.

HTH, Роб.

Другие вопросы по тегам