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 для более подробной информации.