You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:35