Flask+MongoEngine: установить поле документа MongoEngine как уникальное в ранее существовавшем документе

У меня есть приложение, созданное с помощью 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']
}
#[...]

До сих пор я проверял дублирование "username" и "email" в контроллере, но у меня все еще есть в монго эти дублирующие поля для некоторых пользователей, и теперь я хочу установить эти поля ("username" и "email") в быть уникальным, не обнуляемым и обязательным.

Я искал в документах, и теперь я знаю, что я могу сделать это с помощью этой декларации:

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

но MongoEngine не устанавливает это снова, если документ был создан ранее.

Таким образом, я ищу способ для меня (как только решены уже дубликаты) не повторять повторяющиеся поля.

Приложение находится в производстве, зарегистрировано много пользователей. Я могу использовать консоль Монго, чтобы установить индекс или некоторые.

1 ответ

Прежде всего, прежде чем что-либо пытаться сделать полное резервное копирование базы данных!

Вы захотите создать уникальный индекс в поле электронной почты, чтобы обеспечить его уникальность. Если дубликатов электронной почты нет, запрос будет выполнен успешно. Вы получите ошибку, если дубликаты адресов электронной почты уже существуют в базе данных (это не должно иметь место).

Войдите в консоль Монго и создайте индекс:

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

Это создает восходящий индекс на email поле (отсюда 1; -1 будет представлять собой нисходящий индекс). Это делает поиск и сортировку писем намного быстрее. Это также делает его уникальным (что и было вашей реальной целью!), Поэтому запросы, пытающиеся вставить документ с существующим электронным письмом, не будут выполнены.

Смотрите эту статью на официальном сайте MongoDB для более подробной информации.

Другие вопросы по тегам