MongoDB:forEach vs fetch + each

时间:2015-07-17 00:18:46

标签: javascript performance mongodb optimization meteor

当我想从我的Meteor应用程序迭代存储在MongoDB中的一些文档时,我可以使用

db.collection.find( ... ).forEach( function f( doc ){ ... })

var docs = db.collection.find( ... ).fetch();
_.each( docs, function f( doc ){ ... }); // using underscore.js

从性能的角度来看,哪种方式更可取?两种选择都有什么缺点和优点?

1 个答案:

答案 0 :(得分:3)

这两个语句在核心API级别基本相同,即获取光标并转换结果。然而,性能有一个“核心”差异:

  • .forEach() 会将游标结果“一次转换一次”并处理它提供的迭代器功能。

  • 另一方面,
  • .fetch() 从光标“一次性”获取“数组”,这意味着它在一次点击中全部“在内存中”。

所以无论如何,在执行从查询光标中取出的“核心”操作时,实际上“更快”。但是,不评估每个游标迭代的“表达式”可能会“稍微快一些”,因此.fetch()可能在这里赢得“小”。

当然,最重要的是“现在一切都在记忆中”,因此需要考虑“开销”。同样,在.fetch() _.each()时,.fetch()尚未处理,正如俗话所说。 “你在”环形交叉路口可能“松散”的秋千上“获得了什么”

如果没有对特定案例进行全面基准测试,“时间”可能会相似。除非专门应用您正在使用的数据集的大小,否则通用基准测试几乎无用。

因此出现了一般情况,“大约相同”,但是使用connection.query('SELECT * FROM allrounds WHERE id = "' + maxId[0].maxId + '"', function (error, results, fields) { //result: { id: 3, timeStart: 'a', winner: 76561198034202910, //should be 76561198034202907 why is it +3? token: 'CsfjHaw6', status: 0 } var winner = results[0].winner; console.log(winner); //-> 76561198034202910 } 将消耗更多内存,而不仅仅是迭代光标。启动。

相关问题