2015-02-23 40 views
1

我有瓶+ MongoEngine创建了一个应用程序,我有这样的一个“用户文件”:瓶+ MongoEngine:设置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'] 
} 
#[...] 

到目前为止我一直在检查控制器中的“用户名”和“电子邮件”的重复,但我仍然有一些用户在这些重复的字段,现在我想设置此字段(“用户名”和“电子邮件”)为唯一的,不可空并且需要。

我正在寻找的文件,现在我知道我能做到这一点丝毫此声明:

email = db.EmailField(max_length=50, required=True, unique=True) 

但如果该文件是之前创建MongoEngine不要再设置此。

所以,我从现在开始寻找一种方法(一旦解决了已经重复的问题)不会重复出现重复字段。

它在生产中的应用程序,有很多用户注册。 我可以使用mongo控制台设置一些索引或一些。

回答

1

首先,在尝试任何事情之前,做一个完整的数据库备份

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

输入蒙戈控制台和创建索引:

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

这产生在email领域的升序指数(因此1; -1将表示降序索引)。这使得搜索和分类电子邮件的速度更快。它也使得它独一无二(这就是你的实际目标!),所以试图插入带有现有电子邮件的文档的查询将失败。

有关更多详细信息,请参见官方MongoDB站点上的this article