Mongoose查询MongoDB返回结果访问present属性为undefined如何排查
问题根因
你遇到的问题由两个错误共同导致:
- 查询语法使用错误:普通
User.find()的第二个参数是投影配置项,仅支持字段的包含/排除规则,原生不支持直接写$in这类聚合表达式生成计算字段。同时Mongoose默认返回的是封装后的Document对象而非普通JS对象,直接console.log打印时会被序列化成类似普通对象的{ present: true }格式,但实际实例上并没有可直接访问的对应属性。 - 属性访问写法错误:
followed[0][0]是尝试在结果对象上读取键名为"0"的属性,结果对象仅存在present相关字段,必然返回undefinedfollowed[0][present]属于语法错误:方括号访问对象属性时,传入的必须是字符串格式的键名,或是值为目标键名的变量。你直接传入未定义的present标识符,相当于用undefined作为键取值,自然拿不到结果。
你尝试的followed[0].present拿不到值,核心原因是前面提到的查询语法+Mongoose Document实例的封装问题。
修复方案
- 第一步:修正查询逻辑,推荐两种可行写法
写法1:使用聚合管道查询,逻辑更清晰,直接返回计算后的普通结果:
写法2:保留find查询,添加const followed = await User.aggregate([ // 先匹配目标用户 { $match: { _id: followie } }, // 投影计算present字段:判断followerid是否在followers数组中 { $project: { _id: 0, present: { $in: [followerid, "$followers"] } }} ]);.lean()让Mongoose直接返回普通JS对象,跳过Document实例封装(该写法需要MongoDB 4.4及以上版本支持投影内的聚合表达式):const followed = await User.find( { _id: followie }, { _id: 0, present: { $in: [followerid, "$followers"] } } ).lean(); - 第二步:使用正确的语法访问属性
查询返回的是结果数组,取第一个元素后用合法的属性访问语法取值即可:// 点语法访问,最常用 console.log(followed[0].present); // 方括号语法访问,注意键名要加引号 console.log(followed[0]["present"]);
提示:如果不确定返回结构,可以先打印
console.log(Object.keys(followed[0]))查看对象实际包含的可枚举键,快速定位属性访问问题。
内容的提问来源于stack exchange,提问作者Nikhil Udgata
相关产品推荐
相关产品推荐

