Django中的PyMongo与MongoEngine比较
在我的一个项目中,我更喜欢使用Django+Mongo。
我为什么应该使用MongoEngine,而不是直接用PyMongo呢?它有什么好处?用PyMongo查询得到的结果不都是已经是对象了吗?那么MongoEngine的目的是什么呢?
4 个回答
可能已经有点晚了,但对于其他想要尝试Django和MongoDB的人来说,Django-nonrel 是个值得考虑的选择。
这是一个老问题,但我觉得之前的回答并没有真正解答问题。问题不是“什么是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的对象。