Дубликат адреса электронной почты в MongoDB

#javascript #node.js #regex #mongodb

Вопрос:

Gmail обрабатывает любое электронное письмо с точкой (.) так же, как и без точек. Например, почта, отправленная на hello@gmail.com или he.ll.o@gmail.com или he.llo@gmail.com будет отправлено по тому же адресу. Как вы будете хранить это в базе данных, чтобы избежать дублирования использования электронных писем с точками в них. Например, если пользователь сначала регистрируется с salman.khan@gmail.com , он не должен иметь возможности использовать какие-либо варианты одного и того же электронного письма, например sal.mankhan@gmail.com или salman.khan@gmail.com . (Предположим, что в базе данных 10 миллионов пользователей).

Ответ №1:

Вы можете удалить. до сохранения их на сервере, например…

 let emailone = "hello@gmail.com"
let emailtwo = "hel.lo@gmail.com"

const normaliseEmails = email => email.split('@')[0].replaceAll(".", "")   "@"   email.split('@')[1]

console.log(normaliseEmails(emailone))
console.log(normaliseEmails(emailtwo)) 

Ответ №2:

Хорошо, что ты думаешь об этом, так как это может укусить тебя позже. Если вы никогда не собираетесь использовать или отражать адрес электронной почты пользователя, вы, скорее всего, захотите сохранить точки, чтобы вы могли их показать. Так что же делать?

Если это важная проблема для решения, я бы добавил второй столбец в вашу базу данных, a canonical email . Это будут адреса электронной почты без точек. Затем, при поиске адресов электронной почты, «канонизируйте» ввод, удалив точки, а затем найдите его в этом столбце.

Ваша база данных может выполнять это динамически для вас, в зависимости от ее функций. Имейте в виду, что это может быть неэффективно по мере роста базы данных, но может быть приемлемо в краткосрочной перспективе.

Возможно, вам также захочется рассмотреть другие «функции» адресов электронной почты , такие как возможность добавлять дополнительные материалы перед тем @ , как joe duplicate@example.com , например, на которые направляется joe@example.com . Скорее всего, это нормально, но вы также можете захотеть защититься от этого.