基本上我要做的就是聚合数据,然后将其转换为数组。在挂起无法恢复的挂起之前,此过程大约运行2000-4000次。这是我的代码段:
try {
res = await db.collection("palStats").aggregate([...],
{ maxTimeMS: 5000, allowDiskUse: true }
);
debug("#### AGG COMPLETE");
} catch (error) {
debug("AGGREGATION error=============>", error, res);
}
try {
res = await Timeout.wrap(res.toArray(), 10000, "toArray time out");
} catch (error) {
debug("toArray error =================>", error, res);
}
Array.isArray(res)
? null
: debug("response toArray fail ===============>", res);
res = Array.isArray(res) ? res : null;
if (res != null) {
debug("####toArray worked###");
res.forEach(i => (i["modeType"] = i.mode[0]));
debug("###for each passed###");
}
return res;
未显示任何错误消息,呼叫一直挂起,直到Mongo超时(3600秒)。超时后,Mongo将永远无法恢复,也无法打开任何新连接。 最初我以为是聚合,但是我将其范围缩小到toArray()调用挂起。
我目前正在使用Mongo 4.0.9,但是我尝试了几乎所有其他版本的4都没有运气。
我将失败的聚合游标进行了处理,并将其与通过的游标进行了比较,但是我找不到任何明显的区别。
聚合游标差异:
传递的游标具有init:false和session:null?
失败:
21:00: session: ClientSession {
21:00: _events: [Object: null prototype],
21:00: _eventsCount: 1,
21:00: _maxListeners: undefined,
21:00: topology: [Server],
21:00: sessionPool: [ServerSessionPool],
21:00: hasEnded: false,
21:00: serverSession: [ServerSession],
21:00: clientOptions: undefined,
21:00: supports: [Object],
21:00: clusterTime: null,
21:00: operationTime: null,
21:00: explicit: false,
21:00: owner: [Circular],
21:00: defaultTransactionOptions: {},
21:00: transaction: [Transaction]
21:00: }
21:00: },
21:00: init: true,