Django的PyMongo vs MongoEngine

meg*_*ido 25 python django mongodb pymongo mongoengine

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

我为什么要使用MongoEngine,而不仅仅是PyMongo?有什么好处?使用PyMongo查询会产生已经完成对象的结果,不是吗?那么MongoEngine的目的是什么?

小智 38

这是一个古老的问题,但却磕磕绊绊,我不认为接受的答案会回答这个问题.问题不是"什么是MongoEngine?" - 它是"我为什么要使用MongoEngine?" 以及这种方法的优点.这通常超出Django到Python/Mongo.我的两分钱:

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

另外,对我来说,用于使用PyMongo操作文档的语法(基本上与mongo控制台相同)是丑陋的,容易出错的,并且难以维护.

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

BlogPost.objects(id=post.id).update(title='Example Post')
Run Code Online (Sandbox Code Playgroud)

为什么要使用PyMongo?MongoEngine是你和裸机之间的一层,所以它可能比较慢,虽然我没有任何基准.PyMongo是较低级别,所以自然你有更多的控制权.对于简单的项目,可能不需要MongoEngine.如果您已经熟悉Mongo语法,您可能会发现PyMongo比我更直观,并且编写复杂的查询和更新没有问题.也许你喜欢在较低级别上直接使用字典,并且对另外一层抽象不感兴趣.也许你正在编写一个不属于大系统的脚本,你需要它尽可能精简和快速.

这个论点还有更多,但我认为这对基础知识来说非常好.


小智 21

我假设您还没有阅读MongoEngine声明.

MongoEngine是一个Document-Object Mapper(想想ORM,但是对于文档数据库),用于从Python处理MongoDB.

这基本上就说明了一切.

另外:你声称Pymongo会传递对象是错误的......在Python中,一切都是一个对象 - 即使是一个dict也是一个对象......所以你是真的但不是在定义一个自定义类的意义上应用水平.

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

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

  • 好.您更喜欢哪个db后端? (4认同)
  • 不好解释!“如果您不能简单地解释它,那么您就不能理解得足够多”。 (4认同)