添加oplogReplay选项对mongodb中的tailable游标有什么作用?为什么它解决了我的超时问题?

Cov*_*III 6 mongodb node.js

我试图在mongo中拖尾oplog并得到超时错误.oplog集合中包含超过7百万个文档.但是,作为最后的努力,我添加了oplogReplay: true游标选项的选项,超时错误消失了,我正在读取oplog流.

的NodeJS蒙戈文档是相当神秘的什么这个选项实际上做,只知道它是为tailable光标这就是为什么我在看着它:

oplogReplay {Boolean},设置一个内部标志,仅适用于tailable游标.

我的猜测是它要么跳过整个oplog的初始扫描并直到最后,要么从oplog的另一端扫描.

我的代码看起来像这样:

const tstamp = new MongoDB.Timestamp(0, Math.floor(new Date().getTime() / 1000));
const filters = {
  ts: { $gt: tstamp }
};
const curOpts = {
    tailable: true,
    timeout: false,
    oplogReplay: true,  //<- What does this actually do?
    awaitData: true,
    numberOfRetries: 60 * 60 * 24,
    tailableRetryInterval: 1000
};

mongodb.connect(url).then(db => {
    const cur = db.collection('oplog.rs').find(filters, curOpts);
    const stream = cur.stream();
    stream
      .on('data', log => {
        console.log('Data!')
        console.log(log)
      })
      .on('close', () => {
        console.log('Stream closed....')
        db.close()
      })
      .on('error', err => {
        console.log('Stream error....')
        console.error(err)
        db.close()
      });
}));
Run Code Online (Sandbox Code Playgroud)

相关研究

我也发现了这个与之相关的问题和答案.我发现虽然我解决了原来的问题.

当我研究这个问题时,我发现 oplog扫描在30秒后超时,这导致了一些问题.

另一个问题和答案与我的超时问题有关.似乎在oplog的ts字段上创建索引是一个非常糟糕的想法,并且在较新版本的mongo上是不可能的.