Mongoose查询文档后无法访问属性问题求助
问题分析与解决方案
你遇到的这个情况其实挺典型的——核心原因是Mongoose查询返回的不是普通JavaScript对象,而是它自己封装的Document实例。这类对象在控制台打印时能看到属性,但直接用点语法访问时,可能因为Mongoose的内部代理机制返回undefined。
具体原因拆解
Mongoose的Document对象会对数据库字段做一层封装,很多实际字段是存放在对象的_doc属性下的。控制台打印时会自动展开显示这些属性,但直接通过.done访问时,如果没有触发Mongoose的getter逻辑,就拿不到对应的值。
可行的解决办法
方法一:转成普通JS对象再访问
调用文档对象的.toObject()或.toJSON()方法,把它转换成原生JS对象后再访问属性:console.log(games[0].toObject().done); // 或者用toJSON()效果类似 console.log(games[0].toJSON().done);方法二:查询时直接返回普通对象(推荐)
在查询语句末尾加上.lean(),让Mongoose跳过Document实例封装,直接返回原生JS对象,这样后续就能直接用点语法访问属性:// 顺便简化你的代码,Mongoose查询本身支持await,不用手动包Promise const games = await Game.find({ ids: id }).lean(); console.log(games[0].done); // 现在就能正常拿到'1'了方法三:排除字段名拼写问题
虽然你打印的结果显示是done,但可以再确认下数据库里的字段名是否完全一致(比如有没有大小写错误,比如Done),不过这个可能性比较小,只是用来排除极端情况。
另外提一句,你手动用Promise封装Game.find的写法有点多余,Mongoose的查询方法本身就支持await,直接写await Game.find(...)更简洁,也不容易出问题。
内容的提问来源于stack exchange,提问作者m0bi5
相关产品推荐
相关产品推荐

