Mongoose 8.9.5查询性能异常问题排查求助
Mongoose v8.9.5 查询性能异常排查问题
升级Mongoose从v6.8.1到v8.9.5、MongoDB服务器从6.0.0到8.0.4后,出现严重查询性能问题:即使是带索引的简单查询,执行时间也始终至少1秒,但MongoDB的explain输出显示数据库端执行时间可忽略不计。
怀疑该问题与Mongoose处理查询或与MongoDB交互的方式有关,即便配置了正确的索引、MongoDB报告执行耗时极短,问题仍持续存在。
环境信息
- Node.js版本:v18.20.4
- Mongoose版本:v8.9.5
- MongoDB驱动版本:v6.12.0(Mongoose依赖)
- MongoDB服务器版本:8.0.4(Atlas集群)
- 操作系统:Amazon Linux 2(AWS Lambda)
核心疑问:这是否是Mongoose v8.9.5的Bug?还可尝试哪些排查方法?
示例场景
数据模型Schema
const TransactionSchema = new mongoose.Schema({ businessId: { type: mongoose.Schema.Types.ObjectId, required: true }, acquirerTransactionId: { type: String, index: true }, partnerReferenceId: { type: String, index: true }, tempUniqueId: { type: String, index: true }, transactionTime: { type: Date, index: true }, }); const Transaction = mongoose.model("Transaction", TransactionSchema);
数据库连接代码
import mongoose from "mongoose"; mongoose.Promise = global.Promise; let isConnected; export const connectToDatabase = () => { if (isConnected) { console.log("DB connection was previously established"); return Promise.resolve(); } console.log("Establishing a new DB connection..."); console.log(`Mongoose version: ${mongoose?.version}`); const DB_URL = "mongodb+srv://<username>:<password>@<cluster>.mongodb.net/dbname"; mongoose.set("strictQuery", true); return mongoose .connect(DB_URL, { maxIdleTimeMS: 60000 }) .then((db) => { isConnected = db.connections[0].readyState; try { const connection = mongoose.connection; const driverInfo = connection?.client?.s?.options?.metadata; if (driverInfo) { console.log(`MongoDB Driver Info:`, driverInfo); } else { console.log("Driver info is not accessible."); } } catch (error) { console.error("Error accessing MongoDB driver info:", error); } }) .catch((err) => { console.error("Connection error:", err); }); }; connectToDatabase();
查询代码
const result = await Transaction.findOne({ $or: [ { acquirerTransactionId: "502109000037" }, { partnerReferenceId: "502109000037" }, { tempUniqueId: "502109000037" }, ], businessId: "673e24037abe20cc29e0225b", }); console.log("Query result:", result);
该查询耗时约1秒,但MongoDB的explain显示数据库执行时间仅约1毫秒。
已尝试的排查步骤
- 检查MongoDB:直接执行查询速度快,explain()无异常
- 确认索引正确:涉查询字段均配置合适索引
- 开启Mongoose调试模式:验证查询语句正确
- 测试旧版Mongoose:旧版本性能更优
- 重装依赖包:排除损坏依赖问题
新发现
Mongoose 6.12.9无此问题,但6.13.8及更高版本(含8.x、7.x系列)搭配MongoDB Atlas 8.0.4时均存在明显延迟,仅6.12.9响应快速。
内容的提问来源于stack exchange,提问作者totomers
相关产品推荐
相关产品推荐

