我有一个文档从猫鼬发现,我想在JSON编码和发送作为响应之前扩展。如果我尝试向文档添加属性,它会被忽略。属性不会出现在Object.getOwnPropertyNames(doc)中,因此不可能进行正常的扩展。奇怪的是,JSON.parse(JSON.encode(doc))工作并返回一个具有所有正确属性的对象。还有更好的办法吗?
当前回答
如果属性不在模型中,快速的方法是:
文档。Set (key,value, {strict: false});
其他回答
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,所以当它与字符串比较时,将它转换为字符串之前
您还可以对对象进行字符串化,然后再次解析以生成正常的对象。 例如:-
const obj = JSON.parse(JSON.stringify(mongoObj))
我一直在我的文档上使用toObject方法,但没有成功。 我需要添加平坦地图属性为true,最终有一个POJO。
const data = document.data.toObject({ flattenMaps: true });
lean选项告诉Mongoose跳过结果文档的水化。这使得查询更快,内存消耗更少,但结果文档是普通的旧JavaScript对象(pojo),而不是Mongoose文档。
const leanDoc = await MyModel.findOne().lean();
没有必要使用JSON.parse()方法
为了从Mongoose文档中获取普通对象,我使用_doc属性,如下所示
mongooseDoc._doc //returns plain json object
我尝试了toObject,但它给了我函数,参数和所有其他我不需要的东西。
推荐文章
- 检查已安装的angular-cli版本?
- 如何将Blob转换为JavaScript文件
- 如何用Express/Node以编程方式发送404响应?
- 如何安装包从github回购在纱线
- 什么时候.then(success, fail)被认为是承诺的反模式?
- 自动HTTPS连接/重定向使用node.js/express
- 在nodejs http中body在哪里。得到回应?
- 如何在猫鼬排序?
- Nodemon错误:“已达到文件监视器数量的系统限制”
- 如何使webpack开发服务器运行在端口80和0.0.0.0使其公开访问?
- 如何在node.js模块中访问和测试内部(非导出)函数?
- 如何将base64编码的映像保存到磁盘?
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 如何获得请求路径与表达请求对象
- 节点和错误:EMFILE,打开的文件太多