PyMongo против MongoEngine для Джанго - PullRequest
25 голосов
/ 19 апреля 2011

Для одного из моих проектов я предпочел использовать Django + Mongo .

Почему я должен использовать MongoEngine , а не просто PyMongo ? Каковы преимущества? Запросы с PyMongo дают результаты, которые являются уже готовыми объектами , не так ли? Так какова цель MongoEngine?

Ответы [ 4 ]

32 голосов
/ 25 декабря 2016

Это старый вопрос, но наткнулся на него, я не думаю, что принятый ответ отвечает на вопрос. Вопрос не был "Что такое MongoEngine?" - это было «Почему я должен использовать MongoEngine?» И преимущества такого подхода. Это выходит за рамки Django для Python / Mongo в целом. Мои два цента:

Хотя и PyMongo, и MongoEngine оба возвращают объекты (что не так), PyMongo возвращает словари, для которых их ключи должны иметь ссылку на строку. MongoEngine позволяет вам определять схему с помощью классов для данных вашего документа. Затем он отобразит документы на эти классы для вас и позволит вам манипулировать ими. Зачем определять схему для данных без схемы? Потому что, на мой взгляд, это ясно, явно и гораздо проще программировать. Вы не заканчиваете словарями, разбросанными по вашему коду, где вы не можете сказать, что в них находится, фактически не просматривая данные или не запуская программу. В случае MongoEngine и приличной IDE, такой как PyCharm, введите простое "." после того, как объект скажет вам все, что вам нужно знать через автозаполнение. Кроме того, другим разработчикам будет намного проще исследовать и изучать модель данных во время их работы, и каждый, кто еще не видел код, стал более продуктивным и быстрым.

Кроме того, для меня синтаксис, используемый для манипулирования документами с помощью PyMongo (который по сути совпадает с консолью mongo), уродлив, подвержен ошибкам и сложен в обслуживании.

Вот базовый пример обновления документа в MongoEngine, который для меня очень элегантен:

BlogPost.objects(id=post.id).update(title='Example Post')

Зачем использовать PyMongo? MongoEngine - это слой между вами и голым металлом, поэтому он, вероятно, медленнее, хотя у меня нет никаких ориентиров. PyMongo - более низкий уровень, поэтому, естественно, у вас больше контроля. Для простых проектов MongoEngine может быть ненужным. Если вы уже свободно владеете синтаксисом Mongo, вы можете найти PyMongo гораздо более интуитивно понятным, чем я, и у вас не возникнет проблем при написании сложных запросов и обновлений. Возможно, вам нравится работать непосредственно со словарями на этом более низком уровне и не интересуетесь дополнительным уровнем абстракции. Возможно, вы пишете сценарий, который не является частью большой системы, и вам нужно, чтобы он был максимально быстрым и быстрым.

Есть еще аргументы, но я думаю, что это довольно хорошо для основ.

21 голосов
/ 19 апреля 2011

Полагаю, вы не читали претензию MongoEngine.

MongoEngine - это объект-документ Картограф (думаю ОРМ, но для документа базы данных) для работы с MongoDB от Python.

Это, в сущности, все.

Кроме того: ваше утверждение, что Pymongo будет доставлять объекты, неверно ... ну, в Python все является объектом - даже dict - это объект ... так что вы верны, но не в смысле наличия пользовательского класса определяется на уровне приложения.

PyMongo - это низкоуровневый драйвер, оборачивающий API MongoDB в Python и обеспечивающий вход и выход JSON.

MongoEngine или другие слои, такие как MongoKit, отображают ваши данные на базе MongoDB в объекты, аналогичные родным драйверам баз данных Python + SQLAlchemy как ORM.

3 голосов
/ 25 января 2012

Возможно, слишком поздно, но для любого, кто пытается Джанго + Монго, стоит Джанго-нонрел .

1 голос
/ 06 июня 2011

mongoengine будет использовать драйвер pymongo для подключения к mongodb.

Если вы знакомы с django .. используйте mongoengine

...