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