使用 MongoKit¶

    本方案需要一个运行中的 MongoDB 服务器和已安装好的 MongoKit 库。

    使用 MongoKit 有两种常用的方法,下面逐一说明:

    声明是 MongoKit 的缺省行为。这个思路来自于 Django 或 SQLAlchemy 的声明。

    下面是一个示例 模块:

    如果要定义模型,那么只要继承 MongoKit 的 Document 类就行了。如果你已经读过 SQLAlchemy 方案,那么可能会奇怪这里为什么没有使用会话,甚至没有定义一个init_db 函数。一方面是因为 MongoKit 没有类似会话在东西。有时候这样会多写一点 代码,但会使它的速度更快。另一方面是因为 MongoDB 是无模式的。这就意味着可以在插入数据的时候修改数据结构。 MongoKit 也是无模式的,但会执行一些验证,以确保数据的完整性。

    1. from mongokit import ValidationError
    2.  
    3. def max_length(length):
    4. def validate(value):
    5. if len(value) <= length:
    6. return True
    7. # must have %s in error format string to have mongokit place key in there
    8. raise ValidationError('%s must be at most {} characters long'.format(length))
    9. return validate
    10. class User(Document):
    11. structure = {
    12. 'name': unicode,
    13. 'email': unicode,
    14. }
    15. validators = {
    16. 'name': max_length(50),
    17. 'email': max_length(120)
    18. }
    19. use_dot_notation = True
    20. def __repr__(self):
    21.  
    22. # 在当前连接中注册用户文档
    23. connection.register([User])

    上例展示如何定义模式(命名结构)和字符串最大长度验证器。上例中还使用了一个MongoKit 中特殊的 use_dot_notation 功能。缺省情况下, MongoKit 的运作方式和 Python 的字典类似。但是如果 use_dot_notation 设置为 ,那么就可几乎像其他 ORM 一样使用点符号来分隔属性。

    可以像下面这样把条目插入数据库中:

    注意, MongoKit 对于列类型的使用是比较严格的。对于 nameemail 列,都不能使用 str 类型,应当使用 unicode 。

    查询非常简单:

    1. >>> list(collection.User.find())
    2. [<User u'admin'>]
    3. >>> collection.User.find_one({'name': u'admin'})
    4. <User u'admin'>

    PyMongo 兼容层¶

    如果你只需要使用 PyMongo ,也可以使用 MongoKit 。在这种方式下可以获得最佳的性能。注意,以下示例中,没有 MongoKit 与 Flask 整合的内容,整合的方式参见上文:

    1. >>> collection = connection['test'].users
    2. >>> user = {'name': u'admin', 'email': u'admin@localhost'}
    3. >>> collection.insert(user)

    MongoKit 会自动提交。

    直接使用集合查询数据库:

    查询结果为类字典对象:

    1. >>> r = collection.find_one({'name': u'admin'})
    2. u'admin@localhost'

    关于 MongoKit 的更多信息,请移步其 。