Разрушение объекта, возвращаемого результатом запроса mongodb

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Допустим, мы запускаем оператор запроса mongodb следующим образом:

 const user = await db.users.findOne(...);
console.log(user);
  

Результат хороший.

 {
  _id: 5f60647c28b90939d0e5fb24,
  tenantId: '5e6f7c86e7158b42bf500371',
  username: 'aaaa',
  email: 'xxxx@yy.com',
  createdAt: 2020-09-15T06:51:40.531Z,
  updatedAt: 2020-09-15T06:51:40.531Z,
  __v: 0
}
  

Затем мы используем деструктурирование.

 const { _id, username, ...others } = user;
console.log(others);
  

Мы получаем странную вещь:

 [
  [
    '$__',
    InternalCache {
      strictMode: false,
      selected: [Object],
      shardval: undefined,
      saveError: undefined,
      validationError: undefined,
      adhocPaths: undefined,
      removing: undefined,
      inserting: undefined,
      saving: undefined,
      version: undefined,
      getters: {},
      _id: 5f60647c28b90939d0e5fb24,
      populate: undefined,
      populated: undefined,
      wasPopulated: false,
      scope: undefined,
      activePaths: [StateMachine],
      pathsToScopes: {},
      cachedRequired: {},
      session: undefined,
      '$setCalled': Set(0) {},
      ownerDocument: undefined,
      fullPath: undefined,
      emitter: [EventEmitter],
      '$options': [Object]
    }
  ],
  [ 'isNew', false ],
  [ 'errors', undefined ],
  [ '$locals', {} ],
  [ '$op', null ],
  [
    '_doc',
    {
      _id: 5f60647c28b90939d0e5fb24,
      tenantId: '5e6f7c86e7158b42bf500371',
      username: 'aaaa',
      email: 'xxxx@yyy.com',
      createdAt: 2020-09-15T06:51:40.531Z,
      updatedAt: 2020-09-15T06:51:40.531Z,
      __v: 0
    }
  ],
  [ '$init', true ]
]
  

Что здесь происходит? И как заставить деструктурирование снова работать? Та же ошибка на Object.entries(others) .
Есть один обходной путь, я могу упорядочить его, а затем проанализировать обратно. Но это, очевидно, избыточно.

Ответ №1:

По умолчанию запросы Mongoose возвращают экземпляр класса документов Mongoose. Вот почему вы получаете странный результат после деструктурирования. В вашем случае вам следует использовать .lean() по вашему запросу, чтобы получить ожидаемый результат;

Комментарии:

1. Это слишком странно. Я предлагаю, чтобы Mongoose возвращал обычный объект javascript по умолчанию и возвращал класс документа Mongoose с помощью .Mdc().

Ответ №2:

это работает для меня :

 
const user = UserModel.findOne({...});
const { _id, username, ...others } = user.toObject();