Ссылки против встраивания в MongoDB
Я пытаюсь выяснить, как лучше всего использовать MongoDB для очень маленького и простого варианта использования, но нахожу документы несколько запутанными. Мой документ должен отражать тот факт, что у пользователя может быть много писем. Если я следую документации, самое очевидное и простое решение - использовать встраивание. Проблема в том, что когда я хочу проверить адрес электронной почты на уникальность, что AFAIK невозможно с встраиваниями (конечно, я могу использовать карту / уменьшить, но это кажется очень плохим выбором).
Я определенно чувствую, что электронные письма не заслуживают своей собственной коллекции, но, очевидно, встроенный объект не позволяет мне выполнить проверку (и если это произойдет, я действительно не верю, что она будет эффективной). Как бы вы разработали схему в этой ситуации?
1 ответ
Вы можете определить индекс в подполе электронной почты с установленным { unique: true }. Это предотвратит сохранение нескольких копий адреса электронной почты в коллекции.
Например, скажем, ваши документы выглядят примерно так:
db.users.findOne() =>
{
"name" : "xxxx",
"emails" : [
{ address: "one@domain.com", validated: false },
{ address: "two@domain.com", validated: true }
]
}
Вы можете определить уникальный индекс в поле email.address следующим образом:
db.users.ensureIndex(['emails.address',1], {unique: true})
Теперь вы получите сообщение об ошибке, если попытаетесь ввести один и тот же адрес электронной почты дважды. Это также поможет вам оптимизировать поиск пользователей по их электронным адресам, которые в определенный момент будут полезны в вашем приложении.