我正在使用flask和mongodb开发一个web应用程序。我使用(flask-)mongokit定义一个模式来验证我的数据。
在我的数据库中,有一个名为“users”(见下文)的集合,其中包含一个字段“email”。我尝试在mongokit文档(http://namlook.github.com/mongokit/index.html)中指定的字段上创建一个唯一的索引。但是,当我通过mongodb客户端shell检查集合索引时,根本没有索引“email”。
我在网上发现了一个类似的问题:“唯一索引不起作用”(https://github.com/namlook/mongokit/issues/98)
有人知道它为什么不起作用吗?
用户集合:

@db.register
class User(Model):

    __collection__ = 'users'

    structure = {
        'first_name': basestring,
        'last_name': basestring,
        'email': basestring,
        'password': unicode,
        'registration_date': datetime,
    }

    required_fields = ['first_name', 'last_name', 'email', 'password', 'registration_date']

    default_values = {
        'registration_date': datetime.utcnow,
    }

    # Create a unique index on the "email" field
    indexes = [
        {
            'fields': 'email',  # note: this may be an array
            'unique': True,     # only unique values are allowed
            'ttl': 0,           # create index immediately
        },
    ]

db.users.getIndexes()输出:
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "youthmind.users",
    "name" : "_id_"
},
]

注意,我也尝试不使用“ttl”:0,并且我能够使用以下代码创建索引:
db.users.create_index('email', unique=True)

我认为这直接使用了pymongo连接对象。
提前谢谢你的帮助。

最佳答案

你做的正是你应该做的。从Mongokit 0.7.1版(可能是0.8版)起,自动索引创建已被删除。.Here是个问题。
其背后的原因是it必须对集合调用ensureIndex。名称中的“确保”部分使它看起来像是在检查索引,然后如果它不存在就创建索引,但是Mongo的一位开发人员说,它可能最终(重新)创建整个索引,这可能会非常昂贵。开发人员还表示,应该将其视为一项管理任务,而不是开发任务。
解决方法是为列表中定义为升级/创建脚本一部分的每个索引调用create_index自己。

09-19 18:01