You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法为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"
        }
    ]
}

问题原因

  1. Mongoose文档对象限制:corporate.find()返回的是Mongoose的Document实例数组,这类对象严格遵循MongoDB Schema定义,直接添加Schema中不存在的字段会被Mongoose忽略,无法生效。
  2. 语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:20:27