Это старый вопрос, но наткнулся на него, я не думаю, что принятый ответ отвечает на вопрос. Вопрос не был "Что такое 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 гораздо более интуитивно понятным, чем я, и у вас не возникнет проблем при написании сложных запросов и обновлений. Возможно, вам нравится работать непосредственно со словарями на этом более низком уровне и не интересуетесь дополнительным уровнем абстракции. Возможно, вы пишете сценарий, который не является частью большой системы, и вам нужно, чтобы он был максимально быстрым и быстрым.
Есть еще аргументы, но я думаю, что это довольно хорошо для основ.