我有一个来自mongoose的文档,我想在JSON编码之前扩展并作为响应发送出去 . 如果我尝试向doc添加属性,则会被忽略 . 这些属性不会出现在 Object.getOwnPropertyNames(doc) 中,无法正常扩展 . 奇怪的是 JSON.parse(JSON.encode(doc)) 工作并返回一个具有所有正确属性的对象 . 有一个更好的方法吗?
Object.getOwnPropertyNames(doc)
JSON.parse(JSON.encode(doc))
Mongoose Model s继承自 Document ,它有一个 toObject() 方法 . 我相信你所寻找的应该是 doc.toObject() 的结果 .
Model
Document
toObject()
doc.toObject()
http://mongoosejs.com/docs/api.html#document_Document-toObject
另一种方法是通过在查询链中使用lean()告诉Mongoose您需要的只是返回文档的纯JavaScript版本 . 那样Mongoose就会跳过创建完整模型实例的步骤,直接得到一个 doc 你可以修改:
doc
MyModel.findOne().lean().exec(function(err, doc) { doc.addedProperty = 'foobar'; res.json(doc); });
如果属性不在模型中的快速方法:
document.set( key,value, { strict: false });
解决这类问题的更好方法是使用_1837219这样的
doc.toObject({ getters: true })
其他选择包括:
getters: 应用所有getter(路径和虚拟getter)
getters:
virtuals: 应用虚拟getter(可以覆盖getter选项)
virtuals:
minimize: 删除空对象(默认为true)
minimize:
transform: 一个转换函数,在返回之前应用于生成的文档
transform:
depopulate: depopulate任何填充的路径,用原始引号替换它们(默认为false)
depopulate:
versionKey: 是否包含版本密钥(默认为true)
versionKey:
所以你可以说
Model.findOne().exec((err, doc) => { if (!err) { doc.toObject({ getters: true }) console.log('doc _id:', doc._id) } })
现在它会起作用 .
供参考,请参阅:http://mongoosejs.com/docs/api.html#document_Document-toObject
4 回答
Mongoose
Model
s继承自Document
,它有一个toObject()
方法 . 我相信你所寻找的应该是doc.toObject()
的结果 .http://mongoosejs.com/docs/api.html#document_Document-toObject
另一种方法是通过在查询链中使用lean()告诉Mongoose您需要的只是返回文档的纯JavaScript版本 . 那样Mongoose就会跳过创建完整模型实例的步骤,直接得到一个
doc
你可以修改:如果属性不在模型中的快速方法:
document.set( key,value, { strict: false });
解决这类问题的更好方法是使用_1837219这样的
其他选择包括:
getters:
应用所有getter(路径和虚拟getter)virtuals:
应用虚拟getter(可以覆盖getter选项)minimize:
删除空对象(默认为true)transform:
一个转换函数,在返回之前应用于生成的文档depopulate:
depopulate任何填充的路径,用原始引号替换它们(默认为false)versionKey:
是否包含版本密钥(默认为true)所以你可以说
现在它会起作用 .
供参考,请参阅:http://mongoosejs.com/docs/api.html#document_Document-toObject