мангуст ссылается и заполняет документ NOT objectId - PullRequest
0 голосов
/ 29 августа 2018

У меня есть ситуация, и я ищу совет

У меня есть 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, который находит и возвращает всех пользователей в массиве контактов по их электронной почте (некоторые могут быть найдены, а некоторые нет) Но это тоже не самое лучшее, что можно сделать

Мне кажется, что я нахожусь на перекрестке понимания того, как справляться с фундаментальной проблемой "может быть, а может и не быть", и мне нужен совет:)

...