Node.js中利用Mongoose的Model.find()获取指定字段的方法
Mongoose 获取指定字段(替代废弃回调写法)及ODM推荐
问题背景
使用新版Mongoose连接fruitDB数据库的fruits集合,当前能通过Fruit.find()获取所有字段,但需要仅返回指定字段;尝试旧版回调写法触发报错,因为最新版Mongoose已移除回调支持。
现有代码(返回全字段):
import mongoose from "mongoose"; mongoose.connect("mongodb://localhost:27017/fruitsDB"); const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String, }); const Fruit = mongoose.model("Fruit", fruitSchema); // 文档实例(省略保存逻辑) const fruit = new Fruit({ name: "Apple", rating: 7, review: "Pretty solid as a fruit." }); const kiwi = new Fruit({ name: "Kiwi", score: 10, review: "The best fruit!" }); const orange = new Fruit({ name: "Orange", score: 4, review: "Too sour for me" }); const banana = new Fruit({ name: "Banana", score: 3, review: "Weird texture" }); try { for await (const fruitAll of Fruit.find()) { console.log(fruitAll); } } catch (error) { console.log(error); }
尝试的废弃回调写法(无法运行):
Fruit.find(function(err, fruits) { if(err) { console.log(err); } else { fruits.forEach(function(fruit){ console.log(fruit.name); }); } });
解决方案:获取指定字段的正确写法
新版Mongoose仅支持Promise/async-await风格,获取指定字段通过「投影(Projection)」实现,有两种常用方式:
1. 字符串投影
在find()后传入投影字符串,用空格分隔要保留的字段,前面加-表示排除该字段:
try { // 仅获取name字段(_id默认会返回,要排除需加-_id) const fruits = await Fruit.find({}, 'name'); // 或者排除_id,仅返回name // const fruits = await Fruit.find({}, 'name -_id'); fruits.forEach(fruit => console.log(fruit.name)); } catch (error) { console.error(error); }
2. 对象投影
更直观的方式,用对象指定字段的1(保留)或0(排除):
try { // 仅保留name字段,排除默认的_id const fruits = await Fruit.find({}, { name: 1, _id: 0 }); fruits.forEach(fruit => console.log(fruit.name)); } catch (error) { console.error(error); }
简化写法
如果不需要迭代器,直接用await Fruit.find()获取数组更简洁:
try { const fruits = await Fruit.find({}, { name: 1, _id: 0 }); console.log(fruits); // 仅包含name字段的数组 } catch (error) { console.error(error); }
ODM推荐(针对新手)
1. Mongoose
- 优势:MongoDB生态最成熟的ODM,文档齐全,社区活跃,适合快速上手;支持Schema验证、中间件等功能,对新手友好。
- 适合场景:已经在使用Mongoose,或者需要灵活操作MongoDB原生特性的项目。
2. Prisma
- 优势:类型安全的ORM/ODM(支持MongoDB),自动生成TypeScript类型,通过Prisma Client提供直观的查询API;无需手动编写Schema,通过
schema.prisma文件配置,学习曲线平缓。 - 适合场景:使用TypeScript的项目,或者希望减少重复代码、提升开发效率的新手。
内容的提问来源于stack exchange,提问作者Ransike Randeni
相关产品推荐
相关产品推荐

