MongoDB toArray()挂起

时间:2019-07-10 13:31:38

标签: javascript node.js mongodb cursor toarray

基本上我要做的就是聚合数据,然后将其转换为数组。在挂起无法恢复的挂起之前,此过程大约运行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,

0 个答案:

没有答案