【问题标题】:Flask+MongoEngine: Set MongoEngine Document Field as Unique in pre existing DocumentFlask+MongoEngine:在现有文档中将 MongoEngine 文档字段设置为唯一
【发布时间】:2015-04-24 22:45:32
【问题描述】:

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

【问题讨论】:

    标签: python mongodb flask mongoengine flask-mongoengine


    【解决方案1】:

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

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

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

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

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

    有关详细信息,请参阅 MongoDB 官方网站上的this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2020-03-05
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多