У меня есть ситуация, и я ищу совет
У меня есть USER_SCHEMA
, где у пользователя есть контакты, а это массив других пользователей:
export const USER_SCHEMA: Schema = new Schema({
name: {type: String, trim: true},
email: {type: String, lowercase: true, trim: true, unique: true, required: true},
emailVerified: {type: Boolean, required: true, default: false, select: false},
password: {type: String, required: true, select: false},
contacts: [{type: Schema.Types.ObjectId, ref: 'User'}],
});
Пользователь находит контакт по его email
адресу, и либо пользователь возвращается, либо не найден, в зависимости от того, существует он и проверен в БД или нет.
Я бы хотел, чтобы пользователь мог добавить пользователя в качестве контакта даже до того, как он был фактически зарегистрирован , а НЕ указан в БД.
Как я сейчас вижу, мой единственный вариант - создать еще одно поле в SCHEMA
, которое содержит String
массив Emails
:
unregisteredContacts: [{type: String, lowercase: true, trim: true, select: false}]
И скажем, когда пользователь emailVerfied: true
, я могу искать пользователей, которые добавили этого нового проверенного пользователя, пока он еще не был зарегистрирован:
const SELF = await SelfRoute.User.findById(req['userID'])
const USERS = await this.User.find({ unregisteredContacts: SELF.email })
И затем для каждого найденного пользователя я могу удалить значение из массива unregisteredContacts
и вставить SELF._id
в массив contacts
(тип Schema.Types.ObjectId
)
Но это интуитивно кажется, что это не будет наилучшей практикой в плане производительности, и мне любопытно, есть ли способ описать это поле контакта следующим образом:
contacts: [{type: String, ref: 'User'}] // <-- (verified email string)
А потом, когда я вызываю populate, он просто заполняет пользователей, которые действительно перечислены в БД
Как будто вы пишете специальный метод, такой как populateContacts
, который находит и возвращает всех пользователей в массиве контактов по их электронной почте (некоторые могут быть найдены, а некоторые нет)
Но это тоже не самое лучшее, что можно сделать
Мне кажется, что я нахожусь на перекрестке понимания того, как справляться с фундаментальной проблемой "может быть, а может и не быть", и мне нужен совет:)