Почему существует два свойства с именами _id и id, и только одно видно при возврате объекта с помощью mongoose?

#javascript #node.js #mongodb

#javascript #node.js #mongodb

Вопрос:

Когда я печатаю объект, возвращенный после запроса в MongoDB с помощью mongoose, я получаю объект, содержащий один из ключей как ‘_id’. Но когда я пытаюсь напечатать идентификатор свойства объекта и _id, обратившись к объекту, тогда для идентификатора не указывается undefined, вместо этого он печатает тот же идентификатор, что и _id. Я прилагаю скриншоты для кода и вывода ниже.

Вот фрагмент кода

 const user = await User.findById(req.params.id);
console.log(user);
console.log(user.id, user._id);
 

В следующем выводе мы видим, что id и _id содержат одно и то же значение, хотя в пользовательском объекте нет такого свойства, как ‘id’

 {
  role: 'user',
  _id: 5fc6cad25884d51790aad697,
  name: 'Test 001',
  email: 'test001@gmail.com',
  __v: 0
}
5fc6cad25884d51790aad697 5fc6cad25884d51790aad697
 

Ответ №1:

Я полагаю, что основная запутанная часть для вас id — это то, откуда она берется. Вот объяснение из документации:

Mongoose по умолчанию присваивает каждой из ваших схем виртуальный получатель id, который возвращает поле _id документа, приведенное к строке, или, в случае ObjectIds, его шестнадцатеричную строку. Если вы не хотите, чтобы средство получения идентификатора добавлялось в вашу схему, вы можете отключить его, передав эту опцию во время построения схемы. const schema = new Schema({ name: String }, { id: false });

Виртуалы — это свойства документа, которые вы можете получить и установить, но которые не сохраняются в MongoDB. Геттеры полезны для форматирования или объединения полей, в то время как сеттеры полезны для разбиения одного значения на несколько значений для хранения.

подробнее об этом можно прочитать в документации:

id https://mongoosejs.com/docs/guide.html#id

virtuals https://mongoosejs.com/docs/guide.html#virtuals

Ответ №2:

Проверьте, есть ли у объекта user какая-либо проблема, связанная с экземпляром, или нет, иначе этого не произойдет.