我正在使用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
自己。