Meteor js游标hasNext()和next()?

时间:2015-06-15 02:18:04

标签: javascript mongodb meteor

问题

我有一个潜在的大查找查询,一旦满足我的服务器“javascript”条件就必须停止,例如我的服务器已经有文件结果来找出解决方案。

这里的想法是从mongo迭代一个游标,点击“按需”mongo,有点“流”,所以我的服务器或mongo都不能一次获取所有结果。

预期行为

  • 查询并获取游标(r = Collection.find())
  • 检查下一个(r.hasNext())
  • 获取下一个(r.next())
  • 满足我的要求后,停止(删除r)

示例代码

Collection.find().forEach(function(doc) {
  doc = do_my_business( doc );
  if (doc.found) {
    // hey mister cursor, go home and die! don't touch my mongo anymore!
    return false;
  }
});

真正的问题

我创建了另一个问题,实际上我是如何在这里结束的: https://stackoverflow.com/questions/30836586/mongodb-find-near-until-maxdistance-or-at-least-x-records

1 个答案:

答案 0 :(得分:1)

流星光标不是mongo光标。流星游标没有下一个或下一个。所以,这只是一个关于forEach的问题,与ES5 forEach相同。所以,你可以做什么:

1.将所有文档存入数组&在它上面运行一个for循环,在满足条件时中断。

2.满足标准时转动标志&检查函数的开头:

if (isHappy) return;
doc = do_my_business( doc );
if (doc.found) isHappy = true;

3。使用try catch循环:

foo = {};
try {
  Collection.find().forEach(function(doc) {
    doc = do_my_business( doc );
    if (doc.found) {
      throw foo;
    }
  });
} catch(e) {
  if (e !== foo) {
    throw e;
  }
}

4.忘记forEach垃圾&将$wherefindOne +一起使用(执行find().limit(1).explain(),以便您可以看到它不会触及每个文档。)

5.在您的数据库中存储一些内容,这样您就不必在光标上使用javascript。应该像瘟疫一样避免在服务器上的每个文档上重复javascript循环。存储很便宜。加工,而不是那么多。