简介:本文详细介绍了如何快速安装MongoDB数据库、配置Mongoose并实现增删改查操作,适合Node.js开发者快速入门。
MongoDB是Mongoose依赖的NoSQL数据库,支持文档型数据存储。根据操作系统选择安装方式:
brew tap mongodb/brew && brew install mongodb-communitysudo apt-get install -y mongodb-org安装完成后启动服务:
# Windows系统net start MongoDB# Linux/macOS系统sudo service mongod start
验证服务状态:
mongo --eval "db.adminCommand('listDatabases')"
创建新项目并安装依赖:
mkdir mongoose-demo && cd mongoose-demonpm init -ynpm install mongoose express
在db.js中配置连接:
const mongoose = require('mongoose');async function connectDB() {try {await mongoose.connect('mongodb://localhost:27017/demoDB', {useNewUrlParser: true,useUnifiedTopology: true});console.log('数据库连接成功');} catch (error) {console.error('数据库连接失败:', error);process.exit(1);}}module.exports = connectDB;
创建models/User.js定义用户模型:
const mongoose = require('mongoose');const userSchema = new mongoose.Schema({username: {type: String,required: [true, '用户名不能为空'],unique: true,trim: true,minlength: [3, '用户名至少3个字符']},email: {type: String,required: true,validate: {validator: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),message: '请输入有效的邮箱地址'}},age: {type: Number,min: [18, '年龄不能小于18岁'],max: 120},createdAt: {type: Date,default: Date.now}});module.exports = mongoose.model('User', userSchema);
const User = require('./models/User');async function createUser() {try {const newUser = new User({username: 'john_doe',email: 'john@example.com',age: 25});const savedUser = await newUser.save();console.log('用户创建成功:', savedUser);} catch (error) {console.error('创建用户失败:', error);}}
async function createMultipleUsers() {try {const users = [{ username: 'user1', email: 'user1@example.com', age: 22 },{ username: 'user2', email: 'user2@example.com', age: 28 }];const result = await User.insertMany(users);console.log('批量创建成功:', result);} catch (error) {console.error('批量创建失败:', error);}}
async function findUsers() {try {// 查询所有用户const allUsers = await User.find();console.log('所有用户:', allUsers);// 条件查询const specificUser = await User.findOne({ username: 'john_doe' });console.log('特定用户:', specificUser);// 分页查询const paginatedUsers = await User.find().skip(10) // 跳过前10条.limit(5); // 限制返回5条} catch (error) {console.error('查询失败:', error);}}
async function advancedQuery() {try {// 条件组合const result = await User.find({age: { $gt: 20 }, // 年龄大于20$or: [ // 或条件{ username: /^john/ }, // 用户名以john开头{ email: /@test\.com$/ } // 邮箱以@test.com结尾]});// 字段选择const minimalData = await User.find({}, 'username email');// 排序const sortedUsers = await User.find().sort({ age: -1 }); // 年龄降序} catch (error) {console.error('高级查询失败:', error);}}
async function updateUser() {try {// 更新第一个匹配的文档const updated = await User.updateOne({ username: 'john_doe' },{ $set: { age: 26 } });console.log('更新结果:', updated);// 更新并返回修改后的文档const findAndUpdate = await User.findOneAndUpdate({ username: 'john_doe' },{ $inc: { age: 1 } }, // 年龄+1{ new: true } // 返回更新后的文档);} catch (error) {console.error('更新失败:', error);}}
async function bulkUpdate() {try {const result = await User.updateMany({ age: { $lt: 25 } }, // 年龄小于25{ $set: { status: 'young' } });console.log('批量更新结果:', result);} catch (error) {console.error('批量更新失败:', error);}}
async function deleteUser() {try {// 删除第一个匹配的文档const result = await User.deleteOne({ username: 'john_doe' });console.log('删除结果:', result);// 查找并删除const deletedUser = await User.findOneAndDelete({ username: 'user1' });} catch (error) {console.error('删除失败:', error);}}
async function bulkDelete() {try {const result = await User.deleteMany({ status: 'young' });console.log('批量删除结果:', result);} catch (error) {console.error('批量删除失败:', error);}}
连接管理:
mongoose.connection.on('error')监听错误错误处理:
try/catch处理异步操作性能优化:
安全实践:
const express = require('express');const connectDB = require('./db');const User = require('./models/User');const app = express();app.use(express.json());// 连接数据库connectDB();// 创建用户路由app.post('/users', async (req, res) => {try {const user = new User(req.body);const savedUser = await user.save();res.status(201).json(savedUser);} catch (error) {res.status(400).json({ error: error.message });}});// 查询用户路由app.get('/users', async (req, res) => {try {const users = await User.find().skip(parseInt(req.query.skip || 0)).limit(parseInt(req.query.limit || 10));res.json(users);} catch (error) {res.status(500).json({ error: error.message });}});const PORT = 3000;app.listen(PORT, () => {console.log(`服务器运行在 http://localhost:${PORT}`);});
通过本文的学习,您已经掌握了:
建议进一步学习:
记住,实践是掌握Mongoose的关键。建议从简单的CRUD应用开始,逐步增加复杂度,最终能够熟练处理各种数据库操作场景。