你如何将一个Mongoose文档变成一个普通的对象?

我有一个来自mongoose的文档,发现我想在JSON编码之前扩展并作为响应发送出去。 如果我尝试向文档添加属性,它将被忽略。 这些属性不会出现在Object.getOwnPropertyNames(doc)使得正常的扩展是不可能的。 奇怪的是, JSON.parse(JSON.encode(doc))工作并返回一个对象与所有正确的属性。 有没有更好的方法来做到这一点?

Mongoose ModelDocumentinheritance,它有一个toObject()方法。 我相信你要找的应该是doc.toObject()的结果。

http://mongoosejs.com/docs/api.html#document_Document-toObject

另一种方法是通过在查询链中使用lean()来告诉Mongoose,您所需要的只是返回文档的普通JavaScript版本。 这样,Mongoose跳过创build完整模型实例的步骤,并直接获取可以修改的doc

 MyModel.findOne().lean().exec(function(err, doc) { doc.addedProperty = 'foobar'; res.json(doc); }); 

财产不在模型中的快速方式:

document.set( key,value, { strict: false });

用Typescript和lodash,我做了以下几件事:

 _.assign<IUser>({}, doc) 

其中IUser是类或接口定义,而doc是下面定义的基础文档。

 interface UserDoc extends IUser, mongoose.Document { } 

在属性不完全alignment的情况下,我创build静态方法

 static castUserDoc(doc: UserDoc): $User { // ++ const result: any = _.assign({}, doc); // any is necessary to abandon type inferencing result.prop = _.keyBy(result.prop, '_id'); // +++ return <$User>result; // cast back into type safety } 

++注意IUser$User有所不同

+++ prop$User上的映射,但是是IUser上的映射

像这样执行:

 const user: $User = $User.castUserDoc(doc);