Python PyMongo对Django的MongoEngine

Python PyMongo对Django的MongoEngine,python,django,mongodb,pymongo,mongoengine,Python,Django,Mongodb,Pymongo,Mongoengine,对于我的一个项目,我更喜欢使用Django+Mongo 为什么我应该使用MongoEngine,而不仅仅是PyMongo?优势是什么?使用PyMongo查询得到的结果是所有就绪对象,不是吗?那么,MongoEngine的目的是什么呢?我想你还没有读过MongoEngine的声明 MongoEngine是一个文档对象 映射器(考虑ORM,但不考虑文档) 数据库),用于使用MongoDB 来自Python 这基本上说明了一切 另外:你声称Pymongo将交付对象是错误的……在Python中,一切都是

对于我的一个项目,我更喜欢使用Django+Mongo


为什么我应该使用MongoEngine,而不仅仅是PyMongo?优势是什么?使用PyMongo查询得到的结果是所有就绪对象,不是吗?那么,MongoEngine的目的是什么呢?

我想你还没有读过MongoEngine的声明

MongoEngine是一个文档对象 映射器(考虑ORM,但不考虑文档) 数据库),用于使用MongoDB 来自Python

这基本上说明了一切

另外:你声称Pymongo将交付对象是错误的……在Python中,一切都是一个对象——甚至dict也是一个对象……因此你是正确的,但不是在应用程序级别定义自定义类

PyMongo是将MongoDB API包装到Python中并提供JSON输入输出的低级驱动程序


MongoEngine或MongoKit等其他层将基于MongoDB的数据映射到类似于本机Python数据库驱动程序+SQLAlchemy作为ORM的对象。

MongoEngine将使用pymongo驱动程序连接到MongoDB


如果你熟悉django。。使用mongoengine可能为时已晚,但对于任何试图使用Django+Mongo的人来说,这是一个值得考虑的问题。

这是一个古老的问题,但我不认为公认的答案能够回答这个问题。问题不是“什么是MongoEngine?”——而是“我为什么要使用MongoEngine?”以及这种方法的优势。一般来说,这超出了Django到Python/Mongo的范围。我的两分钱:

虽然PyMongo和MongoEngine都返回对象(这并没有错),但PyMongo返回的字典需要字符串引用它们的键。MongoEngine允许您通过类为文档数据定义模式。然后,它会为您将文档映射到这些类中,并允许您操作它们。为什么要为无模式数据定义模式?因为在我看来,它清晰、明确,而且更容易编程。最终,你不会发现字典散落在你的代码中,在没有实际查看数据或运行程序的情况下,你无法分辨其中的内容。对于MongoEngine和PyCharm等像样的IDE,在对象后键入一个简单的“.”将通过auto complete告诉您所有需要知道的信息。对于其他开发人员来说,在他们工作的过程中检查和学习数据模型也更容易,这将使那些在一段时间内没有看过代码的人更高效、更快

此外,对我来说,使用PyMongo操作文档所使用的语法(本质上与mongo控制台相同)难看、容易出错,并且难以维护

以下是在MongoEngine中更新文档的一个基本示例,对我来说,这非常优雅:

BlogPost.objects(id=post.id).update(title='Example Post')
为什么使用PyMongo?MongoEngine是你和裸机之间的一层,所以它可能会慢一些,尽管我没有任何基准测试。PyMongo级别较低,所以自然你有更多的控制权。对于简单的项目,可能不需要MongoEngine。如果您已经精通Mongo语法,您可能会发现PyMongo比我直观得多,并且在编写复杂查询和更新时没有问题。也许您喜欢在较低级别上直接使用字典,而对附加的抽象层不感兴趣。也许你写的脚本不是一个大系统的一部分,你需要它尽可能的精简和快速


争论的内容还有很多,但我认为这对于基础来说是非常好的。

好的。您更喜欢哪个db后端?解释得不好!“如果你不能简单地解释它,你就不能很好地理解它”。谢谢你的观点。我来自pymongo世界,直到这篇文章,我才真正了解到mongoengine的魅力。您的一行代码完美地演示了mongoengine如何在某些情况下降低复杂性并使开发人员的生活更加愉快。