mongoose入门教程

news/2025/3/14 16:24:55/文章来源:https://www.cnblogs.com/lijintao1025/p/18772326

以下是详细的 Mongoose 入门教程,包含代码示例和关键概念说明:


1. 环境准备

安装依赖

npm install mongoose

启动 MongoDB 服务

本地安装或使用 MongoDB Atlas 云服务


2. 基本连接

const mongoose = require('mongoose');// 基础连接
mongoose.connect('mongodb://localhost:27017/mydb').then(() => console.log('Connected to MongoDB')).catch(err => console.error('Connection failed:', err));// 带配置的连接
mongoose.connect('mongodb://localhost:27017/mydb', {useNewUrlParser: true,useUnifiedTopology: true,serverSelectionTimeoutMS: 5000
});

3. Schema 定义

基本字段类型

const userSchema = new mongoose.Schema({username: {type: String,required: true,minlength: 3,maxlength: 20},age: {type: Number,min: 18,max: 100},createdAt: {type: Date,default: Date.now},hobbies: [String], // 字符串数组address: {street: String,city: String}
});

自定义验证

const productSchema = new mongoose.Schema({price: {type: Number,validate: {validator: function(v) {return v >= this.costPrice; // 售价必须大于成本价},message: props => `售价 ${props.value} 不能低于成本价`}},costPrice: Number
});

4. 创建模型

const User = mongoose.model('User', userSchema);
const Product = mongoose.model('Product', productSchema);

5. CRUD 操作

创建文档

const newUser = new User({username: 'john_doe',age: 25,hobbies: ['reading', 'coding']
});// 保存方式1
const savedUser = await newUser.save();// 保存方式2
await User.create({username: 'jane_smith',age: 30
});

查询文档

// 基础查询
const users = await User.find({ age: { $gt: 20 } });// 链式查询
const user = await User.findOne({ username: 'john_doe' }).select('username age').sort('-age').limit(5);

更新文档

// 直接更新
await User.updateOne({ username: 'john_doe' },{ $set: { age: 26 } }
);// 先查询后保存
const user = await User.findById('...');
user.age = 26;
await user.save();

删除文档

await User.deleteOne({ _id: '...' });
await User.findByIdAndDelete('...');

6. 中间件(Hooks)

pre 保存钩子

userSchema.pre('save', function(next) {if (this.isNew) {this.createdAt = Date.now();}next();
});

post 查询钩子

userSchema.post('find', function(docs) {console.log(`查询到 ${docs.length} 个用户`);
});

7. 关联查询

定义关联模型

const postSchema = new mongoose.Schema({title: String,author: {type: mongoose.Schema.Types.ObjectId,ref: 'User'}
});
const Post = mongoose.model('Post', postSchema);

填充查询

const posts = await Post.find().populate('author', 'username').exec();

8. 聚合查询

const result = await User.aggregate([{ $match: { age: { $gt: 20 } } },{ $group: { _id: "$city",averageAge: { $avg: "$age" }}}
]);

9. 错误处理

try {await User.create({ age: 17 }); // 触发最小年龄验证
} catch (err) {if (err instanceof mongoose.Error.ValidationError) {console.log('验证错误:', err.message);}
}

10. 最佳实践

  1. 连接管理
// 连接状态监控
mongoose.connection.on('connected', () => console.log('MongoDB connected'));
mongoose.connection.on('error', (err) => console.error('MongoDB error', err));
mongoose.connection.on('disconnected', () => console.log('MongoDB disconnected'));
  1. 全局插件
// 为所有 Schema 添加时间戳
mongoose.plugin((schema) => {schema.add({ createdAt: { type: Date, default: Date.now },updatedAt: { type: Date, default: Date.now }});schema.pre('save', function(next) {this.updatedAt = Date.now();next();});
});

11. 调试模式

// 查看所有执行的查询
mongoose.set('debug', true);

12. 性能优化

索引创建

userSchema.index({ username: 1 }, { unique: true });
userSchema.index({ age: 1, city: 1 });

查询优化

// 仅返回需要字段
await User.find().select('username');// 限制结果数量
await User.find().limit(100);

13. 完整示例

const mongoose = require('mongoose');// 1. 连接数据库
mongoose.connect('mongodb://localhost:27017/mydb');// 2. 定义 Schema
const bookSchema = new mongoose.Schema({title: { type: String, required: true },author: String,price: Number,published: Boolean
});// 3. 创建模型
const Book = mongoose.model('Book', bookSchema);// 4. 业务操作
async function main() {// 创建const book = await Book.create({title: 'Node.js实战',author: '张三',price: 59.9,published: true});// 查询const foundBook = await Book.findById(book._id);// 更新await Book.updateOne({ _id: book._id },{ $set: { price: 69.9 } });// 删除await Book.deleteOne({ _id: book._id });
}main().catch(err => console.error(err));

常见问题解答

  1. 连接池配置
mongoose.connect(uri, {poolSize: 10, // 最大连接数socketTimeoutMS: 45000
});
  1. 时区处理
const date = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' 
});
  1. 批量操作
await User.insertMany([{ username: 'user1', age: 25 },{ username: 'user2', age: 30 }
]);

通过这个教程,你可以掌握 Mongoose 的核心用法。建议配合官方文档 (https://mongoosejs.com/) 深入学习高级特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898718.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No.65 Vue---Axios 网络请求、Axios 网络的请求封装、网络请求跨域解决方案

一、Axios 网络请求Axios 是一个基于 promise 的网络请求库。1.1 安装ctrl + c :停止服务。 安装:npm install -save axios 安装完启动原来的服务:npm run serve 1.2 引入局部引用:import axios from axios; //局部引用 全局引用: 1.3 get请求方式//get請求方式axios({met…

我的博客开启啦

由于微信访问限制,请长按识别下方二维码跳转下载

FastAPI复杂查询终极指南:告别if-else的现代化过滤架构

title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系统讲解FastAPI中复杂查询条件的构建方法,涵盖参数验证、动态过滤、安全防护等18个核心技术点。通过引入策略模式、声明式编程等技术,彻…

基于Ollama本地部署DeepSeek-r1:7b大语言模型

1、概述随着人工智能技术的飞速发展,越来越多的开发者和企业开始关注大语言模型(LLM)。这些模型以其强大的自然语言处理能力,在文本生成、问答、翻译、分类等多种任务中表现出色。然而,在实际使用中,许多人会遇到如何快速且高效地部署这些模型的问题。本文将介绍如何通过…

web116笔记(misc+lfi)

访问题目是一个视频,源码也没有什么有用信息 提示:misc+lfi 下载视频,使用 010editor 打开,发现存在 png 图片的数据,搜索另存为 过滤了蛮多的,不过没有过滤flag ,也没有过滤 filter 尝试构造语句?file=php://filter/resource=flag.php (直接读取) 如果没有设置 fil…

具身智能

Topic I: 3D VIsion Topic II: Robotics Topic IV: Reinforcement learning Linear Algebra Vector Space 向量空间Linear Combination 线性组合\(w=a_1v_1+a_2v_2+...+a_nv_n=\sum_i a_iv_i\)Span of Vectors\(v_i \in V_m\), \(w \in V_m\)Infinite-Ddimensional Vector Spac…

python的jieba

jieba 是一个广泛使用的 Python 中文分词库,主要用于将中文文本切分成独立的词语。 https://github.com/fxsjy/jieba 安装pip install jieba使用 (1)分词import jieba # 分词 text = "我爱自然语言处理" words = jieba.cut(text, cut_all=False) # 精确模式 prin…

3. 创建一个菜单组件-DeepSeek辅助编程

在deepseek中输入: 创建一个vue组件 组件实现菜单的功能 需要让调用该组件是可以自定义一些属性:mode:horizontal横向显示/vertical纵向显示,background-color,text-color,active-text-color,model:通过该model绑定菜单/model为MenuItem的数组 MenuItem由这些参数构成:inde…

微信支付相关配置

公众号相关配置 地址:https://mp.weixin.qq.com/一、获取用户openid相关配置 二、获取开发者ID(AppID)/开发者密码(AppSecret) 微信支付相关配置 地址:https://pay.weixin.qq.com/需要先申请开通支付产品微信支付相关参数获取: 一:获取商户号(商户号mach_id)三、获取证书…

华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手

通过实际操作,让开发者熟悉如何通过云主机部署DeepSeek,以及如何将DeepSeek与Cherry Studio结合起来帮助我们解决一些实际的问题。本文分享自华为云社区《华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手》,作者:开发者空间小蜜蜂。 1 案例介绍 CherryStudio …

​信创环境元宇宙应用:3种虚拟团队管理工具前瞻测评

随着信息技术的不断发展,信创环境下的元宇宙应用正逐渐成为各行业关注的焦点。在这个虚拟的世界中,虚拟团队的管理变得至关重要。本文将对三种虚拟团队管理工具进行前瞻测评,探讨它们在信创环境元宇宙应用中的优势和潜在挑战。 信创国产化项目管理解决方案 禅道是一款国产的…