1

我有一个用 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 控制台设置一些索引或一些。

4

1 回答 1

1

首先,在尝试任何事情之前,请进行完整的数据库备份

您将希望在电子邮件字段上创建一个唯一索引以强制其唯一性。如果没有重复的电子邮件,则查询将成功。如果数据库中已经存在重复的电子邮件地址,您将收到错误消息(不应该是这种情况)。

进入mongo控制台,创建索引:

db.YOUR_COLLECTION.ensureIndex({ email: 1 }, { unique: true })

这会在字段上创建一个升序索引email(因此 1;-1将表示一个降序索引)。这使得搜索和排序电子邮件更快。它还使其独一无二(这是您的实际目标!),因此尝试插入包含现有电子邮件的文档的查询将失败。

有关更多详细信息,请参阅官方 MongoDB 网站上的这篇文章。

于 2015-02-23T21:50:11.983 回答