无法为Mongoose查询结果添加totalcases字段问题求助
Express路由无法给MongoDB查询结果添加自定义字段
原代码
router.post('/BWreport', async function(req, res, next){ try{ var cname = await corporate.find().select('corporateID username'); cname.forEach(function(cname, await){ cname["totalcases"] = 1; }); return res.json({ response:true, data:cname }); }catch(err){ return res.json({ response:false, data:err }); } });
当前输出
{ "response": true, "data": [ { "_id": "61d3f90340b6cad5974ca50a", "username": "SB Demo", "corporateID": "SB00001" }, { "_id": "62266f20fa0eb7a8fbe7d82a", "corporateID": "SB00002", "username": "NeoGrowth" } ] }
期望输出
{ "response": true, "data": [ { "_id": "61d3f90340b6cad5974ca50a", "username": "SB Demo", "corporateID": "SB00001", "totalcases": "1" }, { "_id": "62266f20fa0eb7a8fbe7d82a", "corporateID": "SB00002", "username": "NeoGrowth", "totalcases": "1" } ] }
问题原因
- Mongoose文档对象限制:
corporate.find()返回的是Mongoose的Document实例数组,这类对象严格遵循MongoDB Schema定义,直接添加Schema中不存在的字段会被Mongoose忽略,无法生效。 - 语法错误:
forEach的第二个参数使用了await,这是JavaScript的保留关键字,不能用作变量名,会导致代码逻辑异常。
解决办法
方案1:使用.lean()转换为普通JS对象
在查询时添加.lean(),让Mongoose返回普通JavaScript对象,即可自由添加自定义字段,同时修正forEach的参数名:
router.post('/BWreport', async function(req, res, next){ try{ // 用lean()将查询结果转为普通JS对象 var cname = await corporate.find().select('corporateID username').lean(); // 修正参数名,避免使用保留关键字 cname.forEach(function(item){ item.totalcases = "1"; // 匹配期望输出的字符串类型 }); return res.json({ response:true, data:cname }); }catch(err){ return res.json({ response:false, data:err }); } });
方案2:使用map生成新数组(更简洁)
通过map方法直接生成包含自定义字段的新数组,同样配合.lean()使用:
router.post('/BWreport', async function(req, res, next){ try{ var cname = await corporate.find().select('corporateID username').lean(); // 扩展原对象并添加新字段 const result = cname.map(item => ({ ...item, totalcases: "1" })); return res.json({ response:true, data:result }); }catch(err){ return res.json({ response:false, data:err }); } });
内容的提问来源于stack exchange,提问作者Ankit Patel
相关产品推荐
相关产品推荐

