Не могу заменить документ монго
Я пытаюсь сохранить документы в кластере 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, Роб.