我在Node.JS中有一个应用程序,它基本上每30分钟从WebAPI检索数据的快照。当我尝试通过使用聚合查询查询数据库时,应用程序触发一个与超时相关的错误(MongoError:连接1到127.0.0.1:27017超时)。从我的日志中我看到正好是30秒。聚合查询是这样的:
collection.aggregate([{
"$group": {
"_id": {
country: "$country",
user: "$user"
}
}
}]).
我在不同的客户端(但相同的数据库)上测试了查询,对于25000.000条记录需要大约60秒。我的假设是,存在一个值为30秒的超时参数,阻止我的应用程序完成查询。有人能告诉我如何在Node.JS中设置这个参数吗?我正在使用'mongodb' js库和我的主机是Windows。
由于这是一个个人项目,我想调查如何使用MongoDB而不是更传统的解决方案,如Oracle或MySQL,但这可能是一个交易破坏者,因为分析是整个应用程序的核心部分。
我在这个答案中找到了一个解决方案:"服务器x超时"
基本上,连接字符串现在看起来像这样:this.server = 'mongodb://127.0.0.1:27017/test?socketTimeoutMS=90000';
socketTimeoutMS
做到了这一点,我不再得到连接超时错误。
在你的mongo connect
let options = {
server: {
auto_reconnect: true,
socketOptions: {
keepAlive: 1,
connectTimeoutMS: 60000,
socketTimeoutMS: 60000,
}
},
replset: {
auto_reconnect: true,
socketOptions: {
keepAlive: 1,
connectTimeoutMS: 60000,
socketTimeoutMS: 60000,
}
}
}
Mongoose.connect(url, options);
看起来正确的选项(如果您正在使用MongoClient)是使用serverSelectionTimeoutMS
代替。你可以这样做:
const client = new MongoClient(mongoUrl, {
serverSelectionTimeoutMS: 1000, useUnifiedTopology: true
})
我还没有测试过,但是你可以在这里找到更多的细节。你也可以在connectTimeoutMS
和maxTimeMS
上找到一些运气。