MongoDB(Mongoose)查询结果部分字段可见却无法访问的问题
问题原因与解决方案
核心原因
这是Mongoose的Document实例字段访问规则导致的:
- Mongoose查询返回的是
Document对象,而非普通JavaScript对象。它仅暴露在Schema中定义过的字段——哪怕MongoDB集合里实际存在这些字段,只要Schema没定义,就无法通过.直接访问。 - 控制台打印时,Mongoose会自动调用
toJSON()或toString()方法,这会显示文档中所有实际存在的字段(包括Schema未定义的),但这和实际可通过属性访问的内容是两回事。 storePrice能正常访问,说明你的ProductSchema里已经定义了这个字段,而dropDate和totalLikes未定义。
解决方案
方案1:更新Schema(推荐)
直接在Product Schema中添加缺失的字段定义,确保字段名、类型和MongoDB中的数据匹配:
const mongoose = require('mongoose'); const productSchema = new mongoose.Schema({ name: String, storePrice: Number, dropDate: Date, // 添加该字段定义 totalLikes: Number, // 添加该字段定义 // 其他已有字段... }); const Product = mongoose.model('Product', productSchema);
修改后重新执行查询,即可直接通过.访问这两个字段。
方案2:使用.lean()返回普通对象
如果不想修改Schema,或仅临时需要获取所有字段,可以在查询链中添加.lean()方法,让Mongoose直接返回普通JS对象而非Document实例:
Product.find({"name": {$regex: search}, '$options': 'i'}}) .select('dropDate storePrice totalLikes') .limit(1) .lean() // 新增该行 .exec((err, product) => { if (err) console.log('[ERROR] Unable to get product. ', err) console.log('Product found is: ', product) console.log('storePrice is: ', product[0].storePrice) console.log('dropDate is: ', product[0].dropDate) // 可正常获取值 console.log('totalLikes is: ', product[0].totalLikes) // 可正常获取值 resolve(product) })
方案3:转换为普通对象(临时处理)
如果已经拿到Document实例,可调用toObject()方法将其转换为普通JS对象后再访问字段:
.exec((err, product) => { if (err) console.log('[ERROR] Unable to get product. ', err) const productObj = product[0].toObject(); // 转换为普通对象 console.log('dropDate is: ', productObj.dropDate) console.log('totalLikes is: ', productObj.totalLikes) resolve(product) })
内容的提问来源于stack exchange,提问作者alienbuild
相关产品推荐
相关产品推荐

