MongoDB Node.js 驱动中的 MongoClient 连接详解
什么是 MongoClient
MongoClient 是 MongoDB Node.js 驱动从 1.2 版本开始引入的全新连接类,它的设计目的是在所有官方驱动中提供统一的连接接口。与传统的 Db 连接类相比,MongoClient 具有以下优势:
- 统一了各语言驱动的连接接口命名
- 默认开启了写操作确认机制
- 提供了更简洁的连接方式
- 支持连接字符串格式
MongoClient 核心方法
MongoClient 提供了以下几个核心方法:
// 构造函数
MongoClient = function(server, options);
// 实例方法
MongoClient.prototype.open
MongoClient.prototype.close
MongoClient.prototype.db
// 静态方法
MongoClient.connect
基本连接示例
下面是一个使用 MongoClient 的基本连接示例:
const MongoClient = require('mongodb').MongoClient;
const Server = require('mongodb').Server;
// 创建 MongoClient 实例
const mongoClient = new MongoClient(new Server('localhost', 27017));
// 打开连接
mongoClient.open((err, mongoClient) => {
// 获取数据库实例
const db = mongoClient.db("mydb");
// 操作数据库...
// 关闭连接
mongoClient.close();
});
连接字符串格式
MongoClient 支持标准的 MongoDB 连接字符串格式:
mongodb://[用户名:密码@]主机1[:端口1][,主机2[:端口2],...[,主机N[:端口N]]][/数据库名][?选项]
连接字符串组成部分
- 协议前缀:必须以
mongodb://
开头 - 认证信息:可选的
用户名:密码@
格式 - 主机地址:可以是一个或多个主机地址
- 端口号:可选,默认为 27017
- 数据库名:认证时使用的数据库,默认为 "admin"
- 选项参数:以
?
开头,多个选项用&
分隔
常用连接选项
副本集配置
replicaSet=名称
:指定副本集名称
连接配置
ssl=true|false|prefer
:是否使用 SSL 连接connectTimeoutMS=毫秒数
:连接超时时间socketTimeoutMS=毫秒数
:socket 操作超时时间
连接池配置
maxPoolSize=数量
:连接池最大连接数(默认 5)
写关注配置
w=值
:写确认级别(1, majority 等)wtimeoutMS=毫秒数
:写确认超时时间journal=true|false
:是否等待日志写入fsync=true|false
:是否等待数据写入磁盘
认证选项
authSource=数据库名
:认证用户所在的数据库
读偏好设置
slaveOk=true|false
:是否允许从次级节点读取readPreference=模式
:读偏好模式(primary/secondary 等)readPreferenceTags=标签集
:按标签选择读取节点
使用 MongoClient.connect 方法
MongoClient.connect
是推荐的连接方式,它会自动选择最佳默认值(如自动重连、使用原生解析器等)。
单节点连接示例
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/testdb", (err, db) => {
if(err) throw err;
// 执行数据库操作
db.collection("users").findOne({}, (err, result) => {
console.log(result);
db.close();
});
});
副本集连接示例
MongoClient.connect(
"mongodb://node1:27017,node2:27017/testdb?replicaSet=myReplSet&readPreference=secondary",
(err, db) => {
// 操作代码...
}
);
分片集群连接示例
MongoClient.connect(
"mongodb://mongos1:27017,mongos2:27017/testdb",
(err, db) => {
// 操作代码...
}
);
连接池最佳实践
为了优化性能,应该避免在每次请求时都创建新连接。推荐的做法是:
- 在应用启动时创建连接
- 在整个应用生命周期中重用该连接
- 在应用关闭时关闭连接
示例:
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const app = express();
let db; // 全局数据库连接
// 初始化连接
MongoClient.connect("mongodb://localhost:27017/mydb", (err, database) => {
if(err) throw err;
db = database;
app.listen(3000);
});
// 在路由中重用连接
app.get("/data", (req, res) => {
db.collection("data").find().toArray((err, results) => {
res.json(results);
});
});
注意事项
- MongoClient 默认会确认写操作,这与传统 Db 连接不同
- 连接字符串中的选项优先级高于代码中指定的选项
- 对于生产环境,建议配置适当的连接池大小和超时设置
- 读写偏好设置对查询性能有重要影响,应根据业务需求合理配置
通过合理使用 MongoClient,可以构建更健壮、高效的 MongoDB Node.js 应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考