我有一个文档从猫鼬发现,我想在JSON编码和发送作为响应之前扩展。如果我尝试向文档添加属性,它会被忽略。属性不会出现在Object.getOwnPropertyNames(doc)中,因此不可能进行正常的扩展。奇怪的是,JSON.parse(JSON.encode(doc))工作并返回一个具有所有正确属性的对象。还有更好的办法吗?
猫鼬模型继承自文档,文档有toObject()方法。我相信您正在寻找的应该是doc.toObject()的结果。
http://mongoosejs.com/docs/api.html#document_Document-toObject
另一种方法是告诉Mongoose,通过在查询链中使用lean(),您所需要的只是返回文档的纯JavaScript版本。这样Mongoose就跳过了创建完整模型实例的步骤,你可以直接得到一个你可以修改的文档:
MyModel.findOne().lean().exec(function(err, doc) {
doc.addedProperty = 'foobar';
res.json(doc);
});
解决这类问题的更好方法是像这样使用doc.toObject()
doc.toObject({ getters: true })
其他选项包括:
Getters:应用所有Getters(路径和虚拟Getters) Virtuals:应用虚拟getter(可以覆盖getter选项) 最小化:删除空对象(默认为true) Transform:在返回之前应用于结果文档的转换函数 Depopulate:取消填充任何已填充的路径,用它们原来的引用替换它们(默认为false) versionKey:是否包含版本键(默认为true)
例如,你可以说
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
为了从Mongoose文档中获取普通对象,我使用_doc属性,如下所示
mongooseDoc._doc //returns plain json object
我尝试了toObject,但它给了我函数,参数和所有其他我不需要的东西。
您还可以对对象进行字符串化,然后再次解析以生成正常的对象。 例如:-
const obj = JSON.parse(JSON.stringify(mongoObj))
JohnnyHK建议:
在某些情况下,就像@JohnnyHK建议的那样,你会想要获得一个纯Javascript的对象。 如本Mongoose文档所述,还有另一种直接作为对象查询数据的方法:
const docs = await Model.find().lean();
有条件地返回Plain Object:
此外,如果有人想有条件地转向一个对象,它也可以作为一个选项参数,参见find() docs的第三个参数:
const toObject = true;
const docs = await Model.find({},null,{lean:toObject});
它可用于函数:find(), findOne(), findById(), findOneAndUpdate(),和findByIdAndUpdate()。
注意:
值得一提的是,_id属性不是一个字符串对象,就像你会做JSON.parse(JSON.stringify(object))一样,而是一个来自mongoose类型的ObjectId,所以当它与字符串比较时,将它转换为字符串之前
lean选项告诉Mongoose跳过结果文档的水化。这使得查询更快,内存消耗更少,但结果文档是普通的旧JavaScript对象(pojo),而不是Mongoose文档。
const leanDoc = await MyModel.findOne().lean();
没有必要使用JSON.parse()方法
我一直在我的文档上使用toObject方法,但没有成功。 我需要添加平坦地图属性为true,最终有一个POJO。
const data = document.data.toObject({ flattenMaps: true });
推荐文章
- 有没有办法修复包锁。json lockfileVersion所以npm使用特定的格式?
- 如何使用npm全局安装一个模块?
- 实时http流到HTML5视频客户端的最佳方法
- 使用node.js下载图像
- Node.js Express中的HTTP GET请求
- Node.js:将文本文件读入数组。(每一行都是数组中的一项。)
- npm犯错!错误:EPERM:操作不允许,重命名
- Node Sass还不支持当前环境:Linux 64位,带false
- 我如何添加环境变量启动。VSCode中的json
- 解析错误:无法读取文件“…/tsconfig.json”.eslint
- 在Node.js中'use strict'语句是如何解释的?
- 当WebSockets可用时,为什么要使用AJAX ?
- 使用过程。TypeScript中的env
- 如何找到哪些承诺未处理在Node.js UnhandledPromiseRejectionWarning?
- 如何卸载Yarn