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 项目

  1. 创建项目目录
   mkdir node-mongodb-demo
   cd node-mongodb-demo
  1. 初始化 Node.js 项目
    运行以下命令,生成 package.json 文件:
   npm init -y
  1. 安装 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 及以上。
  • 性能优化:对于生产环境,使用连接池(默认启用),并避免频繁创建/关闭客户端。

如果你有具体的需求(例如更复杂的查询、分页、聚合等),或者遇到问题,可以告诉我,我会进一步提供针对性的帮助!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注