我有一个使用Flask + MongoEngine创建的应用程序,我有一个像这样的'用户文档':
class User(db.Document):
username = db.StringField(max_length=MAX_USERNAME_CHARS)
name = db.StringField(max_length=70)
#[...]
email = db.EmailField(max_length=50, required=True)
#[...]
meta = {
'indexes': ['-created_at', 'email'],
'ordering': ['-created_at']
}
#[...]
到目前为止,我一直在检查控制器中“用户名”和“电子邮件”的重复,但我仍然在某些用户的mongo这些重复字段中,现在我想设置这些字段(“用户名”和“电子邮件” “)是独特的,不可空和需要。
我正在搜索文档,现在我知道我可以通过这个声明做到这一点:
email = db.EmailField(max_length=50, required=True, unique=True)
但如果之前创建了文档,MongoEngine不会再次设置它。
所以,我现在正在寻找一种方法(一旦解决已经重复),不会重复出现重复的字段。
该应用程序正在投入生产,注册了很多用户。 我可以使用mongo控制台设置一些索引或一些索引。
答案 0 :(得分:1)
首先,在尝试任何操作之前,执行完整的数据库备份!
您需要在电子邮件字段中创建唯一索引以强制其唯一性。如果没有重复的电子邮件,查询将成功。如果数据库中已存在重复的电子邮件地址,您将收到错误(不应该是这种情况)。
进入mongo控制台并创建索引:
db.YOUR_COLLECTION.ensureIndex({ email: 1 }, { unique: true })
这会在email
字段上创建升序索引(因此1; -1
将表示降序索引)。这使得搜索和排序电子邮件的速度更快。它也使它独一无二(这是你的实际目标!),因此试图插入包含现有电子邮件的文档的查询将失败。
有关详细信息,请参阅官方MongoDB网站上的this article。