Обновление записей в MongoDB через pymongo приводит к удалению большинства из них - PullRequest
2 голосов
/ 16 августа 2011

Я работаю с удаленной базой данных mongodb в моем коде на python. Код, обращающийся к базе данных и самой базе данных, находится на двух разных машинах. Используемая им версия модуля pymongo - 1.9+. Скрипт состоит из следующего кода:

 for s in coll.find({ "somefield.a_date" : { "$exists":False },
                               "somefield.b_date" : { "$exists":False }}):
            original = s['details']['c_date']

            utc = from_tz.localize(original).astimezone(pytz.utc)

            s['details']['c_date'] = utc

            if str(type(s['somefield'])) != "<type 'dict'>":
                     s['somefield'] = {}

            s['somefield']['b_date'] = datetime.utcnow()

            coll.update({ '_id' : s['_id'] }, s );

После запуска этого кода произошла странная вещь. Первоначально в коллекции находились миллионы записей, и после запуска сценария осталось только 29% от общего числа записей, остальные были автоматически удалены. Известна ли проблема с драйвером PyMongo версии 1.9+? Какие могли быть другие причины для этого и какие-либо способы узнать, что именно произошло?

1 Ответ

0 голосов
/ 16 августа 2011

Какие могли быть другие причины для этого и каким образом я могу узнать, что именно произошло?

Первое, что нужно проверить, это "были ли исключения" ?

В coll.update() вы не устанавливаете переменную safe. Если есть исключение для update, оно не будет выброшено.

В вашем коде вы не перехватываете исключения (что предлагается), и ваше обновление не проверяет наличие исключений, поэтому у вас нет возможности узнать, что происходит.

Второе, что нужно проверить, это "как ты считаешь" ?

Команда update может «убрать» данные, но не может удалить данные (или изменить _id).

У вас есть копия оригинальных данных? Можете ли вы запустить свой код на небольшом числе из этих 10 или 100 и посмотреть, что происходит?

То, что вы описываете, не нормально с любым из драйверов MongoDB . Нам определенно нужны дополнительные данные для решения этой проблемы.

...