我正在使用mongo DB和mongoose开发一个快速的js API。

我想在Javascript es6中创建一个由少量变量和 Mongoose 请求的结果组成的对象,并希望通过es6 spread运算符来实现:

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

问题在于,将扩展操作符应用于结果会以一种怪异的方式对其进行转换:
newObject: {
   $__: {
      $options: true,
      activePaths: {...},
      emitter: {...},
      getters: {...},
      ...
      _id: "edh5684dezd..."
   }
   $init: true,
   isNew: false,
   toto: "toto",
   _doc: {
      _id: "edh5684dezd...",
      oneFieldOfMyModel: "tata",
      anotherFieldOfMyModel: 42,
      ...
   }
}

我有点理解, Mongoose 丰富了对象结果以允许与它进行特定的交互,但是当我在进行控制台操作之前,console.log描绘了一个没有所有这些东西的简单对象。

我不想通过 ... result._doc 来作弊,因为我将这一部分抽象化了,它不适合这种方式。也许有一种方法可以复制没有外来东西的对象。

感谢您的时间。

最佳答案

您可以使用Mongoose Document.toObject()方法。它将返回从数据库中获取的底层普通JavaScript对象。

const newObject = {...result.toObject(), toto: "toto"};

您可以阅读有关.toObject()方法here的更多信息。

10-06 08:22
查看更多