对于我的一个项目,我更喜欢使用Django+Mongo。
为什么我应该使用MongoEngine,而不仅仅是PyMongo?有什么优势?使用 PyMongo 查询会给出已经是对象的结果,不是吗?那么MongoEngine的目的是什么?
对于我的一个项目,我更喜欢使用Django+Mongo。
为什么我应该使用MongoEngine,而不仅仅是PyMongo?有什么优势?使用 PyMongo 查询会给出已经是对象的结果,不是吗?那么MongoEngine的目的是什么?
这是一个古老的问题,但偶然发现它,我认为接受的答案不能回答这个问题。问题不是“什么是 MongoEngine?” - 它是“我为什么要使用 MongoEngine?” 以及这种方法的优点。一般来说,这超出了 Django 到 Python/Mongo。我的两分钱:
虽然 PyMongo 和 MongoEngine 都返回对象(这没有错),但 PyMongo 返回的字典需要通过字符串引用它们的键。MongoEngine 允许您通过类为文档数据定义模式。然后它将为您将文档映射到这些类中并允许您操作它们。为什么要为无模式数据定义模式?因为在我看来,它清晰、明确且更容易编程。您最终不会得到散布在代码中的字典,如果不实际查看数据或运行程序,您就无法分辨其中的内容。对于 MongoEngine 和像 PyCharm 这样不错的 IDE,输入一个简单的“。” 之后对象会通过自动完成告诉你所有你需要知道的。它'
此外,对我来说,使用 PyMongo(本质上与 mongo 控制台相同)操作文档的语法很难看、容易出错且难以维护。
这是一个在 MongoEngine 中更新文档的基本示例,对我来说非常优雅:
BlogPost.objects(id=post.id).update(title='Example Post')
为什么使用 PyMongo?MongoEngine 是你和裸机之间的一层,所以它可能更慢,虽然我没有任何基准。PyMongo 级别较低,因此您自然拥有更多控制权。对于简单的项目,可能不需要 MongoEngine。如果您已经精通 Mongo 语法,您可能会发现 PyMongo 比我更直观,并且编写复杂的查询和更新也没有问题。也许您喜欢直接使用较低级别的字典,并且对额外的抽象层不感兴趣。也许您正在编写一个不属于大型系统的脚本,并且您需要它尽可能精简和快速。
还有更多的争论,但我认为这对于基础来说非常好。
我假设您还没有阅读 MongoEngine 声明。
MongoEngine 是一个文档对象映射器(想想 ORM,但用于文档数据库),用于从 Python 使用 MongoDB。
这基本上说明了一切。
另外:你声称 Pymongo 会传递对象是错误的......好吧,在 Python 中,一切都是一个对象 - 甚至 dict 也是一个对象......所以你是对的,但不是在定义自定义类的意义上应用层。
PyMongo 是将 MongoDB API 包装到 Python 中并传入和传出 JSON 的低级驱动程序。
MongoEngine 或 MongoKit 等其他层将基于 MongoDB 的数据映射到类似于原生 Python 数据库驱动程序 + SQLAlchemy 作为 ORM 的对象。
可能为时已晚,但对于其他尝试 Django+Mongo 的人来说,Django-nonrel值得考虑。
mongoengine 将使用 pymongo 驱动程序连接到 mongodb。
如果你熟悉 django.. 使用 mongoengine