Эффективно ли использовать функцию частичного индекса MongoDB? - PullRequest
0 голосов
/ 04 февраля 2020

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

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

Ответы [ 3 ]

0 голосов
/ 05 февраля 2020

Пользовательская коллекция будет иметь такую ​​структуру, как правило:

user:

_id
fullname
username
email
phone
etc.

Хранение регистрационных данных отдельно из пользовательских данных поможет управлять данными на основе их функциональности. Итак, введите поле, которое указано c для регистрации. Документ пользователя может иметь поле registration, имеющее следующую форму:

registration: { email: "myname@mymail.com" }
-or-
registration: { phone: "999-888-1234" }

Это позволит регистрационному телефону или электронной почте быть уникальными. Вы можете создать уникальный индекс двух полей отдельно. Для этого используйте частичное индексирование . Например:

db.user.createIndex(
   { "registration.email": 1 },
   { unique: true, partialFilterExpression: { "registration.email": { $exists: true } } }
)

db.user.createIndex(
   { "registration.phone": 1 },
   { unique: true, partialFilterExpression: { "registration.phone": { $exists: true } } }
)

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

Возможные варианты:

  • Используйте доступный зарегистрированный телефон или адрес электронной почты (и зарегистрированный адрес электронной почты или телефон изменить нельзя).
  • Имейте поля телефона и электронной почты пользователя отдельно от зарегистрированного телефона или электронной почты (вопрос, который нужно задать: «Что если пользователь захочет изменить электронную почту или телефон пользователя?»).
0 голосов
/ 05 февраля 2020

Поскольку вы предоставили детали, может быть три случая данных:

  1. коллекция имеет номер телефона, но нет электронной почты
  2. коллекция имеет электронную почту, но нет номера телефона
  3. коллекция может иметь оба поля номер телефона в качестве электронной почты.

Предполагается, что пользователь может создать две учетные записи, одну с помощью номера телефона, а другую с помощью электронной почты.

И, Это будет полностью зависеть от пользователя, если он предоставит электронную почту после создания учетной записи, используя номер телефона, или предоставит номер телефона после создания учетной записи, используя электронную почту.

Итак, я лучше go вперед с созданием составного индекса с использованием двух полей т.е. "phoneNumber" и "электронная почта". Как, это будет охватывать все три случая коллекций.

    db.collection.createIndex( { phone:1, email: 1 } )

Выше создаст индекс, используя оба поля.

0 голосов
/ 04 февраля 2020

Даже если одно из полей будет пустым, вы можете go опередить и создать индексы для обоих этих ключей отдельно, используя sparse index. Несмотря на то, что разреженный индекс для коллекции не может вернуть полные результаты, вам нужно быть осторожным с его использованием.

Другой подход - создать поле, подобное «primary_login_key», которое может быть либо адресом электронной почты, либо номером мобильного телефона. Это позволяет вам иметь один не разреженный индекс. Однако это не будет масштабироваться, как в будущем, если пользователь захочет подключить несколько методов к своему профилю, вам все равно придется создавать эти ключи и индексы для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...