PyMongo vs MongoEngine for Django
对于我的项目之一,我更喜欢使用Django + Mongo。
为什么我应该使用MongoEngine,而不仅仅是PyMongo? 有什么优势? 用PyMongo查询得到的结果都是已经准备好的对象,不是吗? 那么MongoEngine的目的是什么?
这是一个古老的问题,但绊脚石,我认为公认的答案不能回答问题。问题不是"什么是MongoEngine?" -是"为什么我应该使用MongoEngine?"以及这种方法的优点。一般而言,这超出了Django到Python / Mongo的范围。我的两分钱:
虽然PyMongo和MongoEngine都返回对象(这没错),但PyMongo返回需要用字符串引用其键的字典。 MongoEngine允许您通过类为文档数据定义架构。然后它将为您将文档映射到这些类中,并允许您对其进行操作。为什么要为无模式数据定义模式?因为在我看来,它的清晰,明确且易于编程。最终,您不会发现词典中散布着代码,而您在没有实际查看数据或运行程序的情况下无法分辨其中的内容。对于MongoEngine和像PyCharm这样的体面的IDE,键入一个简单的""。在对象将告诉您所有您需要通过自动完成了解的内容之后。对于其他开发人员来说,在他们工作时检查和学习数据模型也变得容易得多,这将使那些在一段时间内不看代码的人变得更有效率,更快。
另外,对我而言,使用PyMongo处理文档的语法(与mongo控制台本质上相同)非常丑陋,容易出错并且难以维护。
这是在MongoEngine中更新文档的基本示例,对我来说,这是非常优雅的:
1 | BlogPost.objects(id=post.id).update(title='Example Post') |
为什么要使用PyMongo? MongoEngine是介于您和裸机之间的一层,因此尽管我没有任何基准测试,但它可能较慢。 PyMongo的级别较低,因此您自然拥有更多的控制权。对于简单的项目,可能不需要MongoEngine。如果您已经精通Mongo语法,则可能会发现PyMongo比我更直观,并且编写复杂的查询和更新没有问题。也许您喜欢直接在较低级别的词典上工作,而对附加的抽象层不感兴趣。也许您正在编写的脚本不是大型系统的一部分,并且您需要它尽可能的精简和快速。
论点还有更多,但我认为这对于基础知识来说相当不错。
我认为您尚未阅读MongoEngine声明。
MongoEngine is a Document-Object
Mapper (think ORM, but for document
databases) for working with MongoDB
from Python.
这基本上说明了一切。
另外:您声称Pymongo会交付对象是错误的....在Python中,所有东西都是对象-甚至dict是对象...所以您是对的,但不是在定义自定义类的意义上应用程序级别。
PyMongo是将MongoDB API包装到Python中并提供进出JSON的低级驱动程序。
MongoEngine或其他类似MongoKit的层将您基于MongoDB的数据映射到类似于本机Python数据库驱动程序+ SQLAlchemy作为ORM的对象。
可能为时已晚,但是对于其他尝试使用Django + Mongo的人来说,Django-nonrel是值得考虑的。
mongoengine将使用pymongo驱动程序连接到mongodb。
如果您熟悉django ..,请使用mongoengine