NestJS从MongoDB获取数据时price字段返回undefined问题
解决MongoDB获取price属性返回undefined的问题
我来帮你排查这个问题,你遇到的price返回undefined的情况,大概率是下面几个原因导致的,咱们一步步来解决:
1. 先检查Mongoose Schema定义
Mongoose会严格按照Schema来过滤返回的字段,如果你的usersmodel对应的Schema里没有定义price字段,哪怕数据库里有这个字段,Mongoose也会自动把它过滤掉,导致你拿到的结果里没有price。
举个例子,如果你的Schema是这样的:
const userSchema = new mongoose.Schema({ name: String // 缺少price字段定义 });
那你需要把price字段加上,根据实际数据类型修改:
const userSchema = new mongoose.Schema({ name: String, price: Number // 如果是字符串类型就写String });
2. 优化查询逻辑,只获取需要的字段
你现在用find()会返回所有文档的所有字段,但你只需要第一个文档的name和price,完全可以用findOne()替代find(),同时通过**投影(Projection)**指定只返回需要的字段,这样既提升查询性能,又能确保拿到目标字段:
修改你的服务层代码:
async total(){ try{ // 用findOne()直接获取第一个文档,指定只返回name和price const firstUser = await this.usersmodel.findOne({}, 'name price').exec(); console.log(firstUser.name); console.log(firstUser.price); return firstUser; // 或者返回你需要的具体数据 } catch(error){ return error.message; } }
这里的'name price'就是投影规则,也可以用对象写法{ name: 1, price: 1 },效果完全一致。
另外要注意,你原代码里的await this.usersmodel.find().exec()放在了try块外面,如果查询出错,catch是捕获不到的,所以一定要把异步查询逻辑放到try块内部。
3. 确认数据库中的实际数据
还有一种可能:你集合里的第一个文档本身就没有price字段!
你可以直接在MongoDB Shell里执行查询,验证这条数据:
db.users.findOne() # 这里的users是你的集合名称,和model对应
如果返回的文档里确实没有price,那代码里拿到undefined就是正常的,你需要检查数据录入的逻辑,确保price字段被正确存入数据库。
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

