Node.js 连接 MongoDB
我来为你详细讲解如何使用 Node.js 连接 MongoDB,并提供清晰的中文说明和代码示例。以下内容将涵盖环境准备、安装依赖、连接 MongoDB 的步骤,以及一些常见操作的示例。代码将基于最新的 MongoDB Node.js 驱动程序(截至2025年7月)。
1. 准备工作
在开始之前,确保你已经完成以下准备:
- 安装 Node.js:确保你的电脑上已安装 Node.js(建议使用 LTS 版本,例如 v20.x)。可以通过命令
node -v
检查版本。 - 安装 MongoDB:你需要一个运行中的 MongoDB 实例。可以是本地安装的 MongoDB 服务器,或者使用 MongoDB Atlas(云端 MongoDB 服务)。
- MongoDB 连接字符串:如果你使用 MongoDB Atlas,注册后会得到一个连接字符串,形如
mongodb+srv://<username>:<password>@cluster0.mongodb.net/<dbname>?retryWrites=true&w=majority
。如果是本地 MongoDB,通常是mongodb://localhost:27017/<dbname>
。
2. 初始化 Node.js 项目
- 创建项目目录:
mkdir node-mongodb-demo
cd node-mongodb-demo
- 初始化 Node.js 项目:
运行以下命令,生成package.json
文件:
npm init -y
- 安装 MongoDB 驱动:
使用 npm 安装 MongoDB 的官方 Node.js 驱动:
npm install mongodb
3. 连接 MongoDB
以下是一个简单的 Node.js 脚本,展示如何连接 MongoDB 数据库:
const { MongoClient } = require('mongodb');
// MongoDB 连接字符串
const uri = 'mongodb://localhost:27017/myDatabase'; // 本地 MongoDB 示例
// 如果使用 MongoDB Atlas,替换为类似:
// const uri = 'mongodb+srv://<username>:<password>@cluster0.mongodb.net/myDatabase?retryWrites=true&w=majority';
// 创建 MongoClient 实例
const client = new MongoClient(uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
async function connectToMongoDB() {
try {
// 连接到 MongoDB
await client.connect();
console.log('成功连接到 MongoDB!');
// 选择数据库
const database = client.db('myDatabase');
// 选择集合
const collection = database.collection('users');
// 示例:插入一条数据
const result = await collection.insertOne({
name: '张三',
age: 25,
email: 'zhangsan@example.com',
});
console.log('插入数据成功:', result.insertedId);
// 示例:查询所有数据
const users = await collection.find({}).toArray();
console.log('查询到的用户:', users);
} catch (error) {
console.error('连接或操作失败:', error);
} finally {
// 关闭连接
await client.close();
console.log('MongoDB 连接已关闭');
}
}
// 执行连接
connectToMongoDB();
代码说明:
- MongoClient:MongoDB 驱动的核心类,用于建立与 MongoDB 的连接。
- uri:连接字符串,指定 MongoDB 的地址和数据库名称。
- async/await:MongoDB 驱动的许多操作是异步的,使用
async/await
语法使代码更清晰。 - useNewUrlParser 和 useUnifiedTopology:这些选项确保使用最新的 MongoDB 驱动解析器和拓扑引擎,推荐开启。
- 插入和查询:示例中展示了插入一条数据和查询集合中的所有数据。
保存上述代码为 index.js
,然后运行:
node index.js
4. 常见 MongoDB 操作
以下是一些常见的 MongoDB 操作示例,基于上面的代码框架:
4.1 插入多条数据
const users = [
{ name: '李四', age: 30, email: 'lisi@example.com' },
{ name: '王五', age: 28, email: 'wangwu@example.com' },
];
const result = await collection.insertMany(users);
console.log(`插入了 ${result.insertedCount} 条数据`);
4.2 查询特定条件的数据
// 查询年龄大于 25 的用户
const query = { age: { $gt: 25 } };
const filteredUsers = await collection.find(query).toArray();
console.log('查询结果:', filteredUsers);
4.3 更新数据
// 更新 name 为 '张三' 的用户年龄
const updateResult = await collection.updateOne(
{ name: '张三' },
{ $set: { age: 26 } }
);
console.log(`更新了 ${updateResult.modifiedCount} 条数据`);
4.4 删除数据
// 删除 email 为 'zhangsan@example.com' 的用户
const deleteResult = await collection.deleteOne({ email: 'zhangsan@example.com' });
console.log(`删除了 ${deleteResult.deletedCount} 条数据`);
5. 错误处理和最佳实践
- 错误处理:始终使用
try-catch
捕获可能的错误,例如网络问题或 MongoDB 服务器不可用。 - 连接管理:在开发环境中,操作完成后关闭连接(
client.close()
)。在生产环境中,通常保持连接池以提高性能,避免频繁开关连接。 - 环境变量:将连接字符串等敏感信息存储在环境变量中,使用
dotenv
包管理:
npm install dotenv
创建 .env
文件:
MONGODB_URI=mongodb://localhost:27017/myDatabase
在代码中加载:
require('dotenv').config();
const uri = process.env.MONGODB_URI;
- MongoDB Atlas:如果使用云端 MongoDB,注意配置网络访问权限(IP 白名单)和用户认证。
6. 调试和测试
- 检查 MongoDB 是否运行:本地 MongoDB 可以通过命令
mongod
启动,或者使用mongo
客户端连接测试。 - 日志输出:在代码中添加详细的日志(如
console.log
),帮助调试连接或操作问题。 - MongoDB Compass:推荐使用 MongoDB Compass(一个 GUI 工具)来可视化数据库内容,验证代码是否正确操作了数据。
7. 扩展:使用 Mongoose(可选)
如果你需要更高级的模型管理,可以使用 Mongoose,它是一个流行的 MongoDB ODM(对象数据建模)库,提供 schema 验证和更简洁的 API。
安装 Mongoose:
npm install mongoose
示例代码:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/myDatabase', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
});
const User = mongoose.model('User', userSchema);
async function run() {
try {
const user = new User({ name: '赵六', age: 22, email: 'zhaoliu@example.com' });
await user.save();
console.log('用户保存成功:', user);
const users = await User.find();
console.log('所有用户:', users);
} catch (error) {
console.error('操作失败:', error);
} finally {
mongoose.connection.close();
}
}
run();
Mongoose 优点:
- 提供 schema 验证,适合复杂的数据结构。
- 内置查询构建器,代码更简洁。
- 支持中间件(如保存前后的钩子)。
8. 常见问题解答
- 连接超时:检查 MongoDB 是否运行,连接字符串是否正确,网络是否允许访问(例如 MongoDB Atlas 的 IP 白名单)。
- 版本兼容性:确保 MongoDB 驱动版本与你的 MongoDB 服务器版本兼容。最新驱动(例如 6.x)支持 MongoDB 4.0 及以上。
- 性能优化:对于生产环境,使用连接池(默认启用),并避免频繁创建/关闭客户端。
如果你有具体的需求(例如更复杂的查询、分页、聚合等),或者遇到问题,可以告诉我,我会进一步提供针对性的帮助!