如何将带有awaitdata的tailable游标移动到最后,以便我获得新的更新

时间:2014-10-27 16:45:49

标签: mongodb

我正在尝试使用node.js驱动程序观看MongoDB oplog,它在理论上有效,但它有很长的时间,因为它似乎正在扫描整个集合。我在MongoDB文档中找到了这个:

  
      
  • 因为tailable游标不使用索引,所以查询的初始扫描可能很昂贵;但是,在最初耗尽光标之后,后续检索新添加的文档的成本很低。
  •   

有没有办法快速排气"光标刚刚开始拖尾?在我看来,流星家伙已经解决了这个问题,但我很难理解阅读代码的不同之处。这就是我目前所拥有的:

var cursorOptions = {
    tailable: true,
    awaitdata: true,
    numberOfRetries: -1
};

var oplogStream = oplogDb.collection('oplog.rs').find(
    {
        ns: { $regex : /^dbname\./ },
        op: "i",
        ts: { $gt: lastEntry.ts } 
    },
    cursorOptions
).sort({$natural: -1}).stream();

oplogStream.on('data', publishDocument);

oplogStream.on('end', function() {
    log.error("received unexpected end event from oplog watcher.");
});

1 个答案:

答案 0 :(得分:4)

很好,在问我找到答案后5分钟。我将在此发布此信息以供将来参考:

您必须添加oplogReplay标记并将其设置为true。如果您还在ts字段上执行范围查询,则仅适用。我没有设置范围之前尝试过此操作,但没有做任何事情。当您添加下面突出显示的这一行时,上面的代码可以使用:

var cursorOptions = {
  tailable: true,
  awaitdata: true,
  oplogReplay: true, // add this line
  numberOfRetries: -1
};