0

ES6 оператор распространения - копирование результата Mongoose

9

Я разрабатываю API на Express.js с использованием MongoDB и Mongoose.

Я пытаюсь создать объект на JavaScript (ES6), состоящий из нескольких переменных и результата запроса Mongoose, и хотел бы сделать это с помощью оператора распространения ES6:

MyModel.findOne({_id: id}, (error, result) => {
   if (!error) {
      const newObject = {...result, toto: "toto"};
   }
});

Проблема заключается в том, что при применении оператора распространения к result объект "превращается" в нечто странное:

newObject: {
   $__: {
      $options: true,
      activePaths: {...},
      emitter: {...},
      getters: {...},
      ...
      _id: "edh5684dezd..."
   },
   $init: true,
   isNew: false,
   toto: "toto",
   _doc: {
      _id: "edh5684dezd...",
      oneFieldOfMyModel: "tata",
      anotherFieldOfMyModel: 42,
      ...
   }
}

Я частично понимаю, что объект result обогащается Mongoose для обеспечения специфичных взаимодействий с ним, но когда я вывожу его в консоль до применения оператора, он выглядит как простой объект без всех этих дополнительных свойств.

Я не хотел бы "обманывать", используя ...result._doc, поскольку этим я абстрагирую эту часть и она не подойдет таким образом. Может быть, существует способ скопировать объект без дополнительных свойств, добавленных Mongoose?

Спасибо за ваше время.

1 ответ(ов)

0

Для кого-то это может быть полезно:

const newObject = {
    ...JSON.parse(JSON.stringify(result)),
    toto: "toto"
};

Однако, следует учитывать ограничения при использовании объектов Date, функций, undefined, регулярных выражений или Infinity в схеме. Эти типы данных не будут корректно сериализованы и могут привести к потере информации или ошибкам. Обязательно проверьте, что ваш объект не содержит такие значения, если вы планируете использовать данный способ клонирования и добавления новых свойств.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь