Apache + Python + Mongo: идентификаторы объектов не равны

Мы запускаем две копии приложения на основе django в экземпляре Apache. У нас есть этот код Python при загрузке объекта из базы данных:

id = pymongo.objectid.ObjectId(hex_string)
d = self.collection.find_one({ '_id': id })
assert id == d['_id']

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

assert str(id) == str(d['_id'])

Утверждение проходит. На наших машинах для разработки (64-разрядная версия Win 7, сервер разработки django вместо Apache) это работает нормально.

Стек: Ubuntu 10.04 LTS, Apache 2.2.14, Python 2.6.5, MongoDB 2.0, Pymongo 2.0.1

Обновление: мы столкнулись с еще одной подобной проблемой. Фактически мы начали ссылаться на объекты как на идентификаторы объектов BSON, и это решило вторую проблему. Однако проблема в этом вопросе все еще возникает, даже при использовании идентификаторов объектов BSON.


person JJO    schedule 23.09.2011    source источник
comment
Есть ли какие-либо ошибки в файле apache error_log в то время, когда вы видите это поведение?   -  person dcrosta    schedule 23.09.2011
comment
Единственная неожиданная вещь, которую я вижу в error_log (помимо DeprecationWarning, которые мы исправляем, это: TemplateDoesNotExist: 500.html   -  person JJO    schedule 23.09.2011
comment
попробуйте записать тип d['_id'] и id. кто они такие? а какие значения?   -  person akonsu    schedule 23.09.2011
comment
Я попытаюсь зарегистрировать их, если смогу понять, как это сделать. Я могу сказать вам, что мы включили отладку в django для сбойного экземпляра и посмотрели на ответ 500, который мы получили. Они оба представляют себя, например, как ObjectId('47283de8cf9cc30d000000') Плюс точно такой же код работает на другом приложении. Я отредактирую вопрос, чтобы прояснить этот смешанный фактор.   -  person JJO    schedule 23.09.2011
comment
docs.djangoproject.com/en/dev/topics/logging   -  person akonsu    schedule 23.09.2011


Ответы (1)


Своего рода выстрел в темноте, но вы случайно не используете шардинг, не так ли? Я не проверял это, но кажется, что есть возможность иметь два документа с одним и тем же _id, если вы разбиваете поле без _id. Вы сами генерируете значения _id или позволяете pymongo сделать это за вас при вставке?

person Rick Copeland    schedule 13.10.2011
comment
Нет, без шардинга. И мы позволяем pymongo создавать идентификаторы для нас. - person JJO; 27.10.2011