带有节点驱动程序的Mongo游标

我正在使用本地驱动程序v2.1为mongo写一个聚合函数。 我的代码看起来像这样:

db.collection("whatever").aggregate(...).each(function(err, doc) { // cursor processing }) 

我的问题是:在哪里执行游标处理? 在客户端或服务器上? 我假设它是在客户端(节点)执行的,如果是这样的话,有没有办法在服务器上运行游标处理(或其他types的数据处理)?

我正在处理大量的数据,而且我不想与mongo服务器来回传输。

谢谢!

“mongodb”驱动程序游标构造函数的一些内部元素。

一个游标的' each '(光标构造函数的原型方法)方法被传递给它的callback函数调用时,

  1. 它触发给定的数据库查询。 通过连线,获取由数据库返回的完整结果集,并将其推入客户端(节点应用程序端)内存中的数组
  2. 然后通过传递上述数组中的每个元素作为参数来调用给“ each ”方法的callback函数。 当然在节点风格。 callback(err, doc)

所以,这里需要注意的一点是,一旦从数据库接收到数据,构build一个数组并重复遍历数据等等,都将在应用程序结束时发生。 加载和迭代数组可能会占用大量内存。 调用者有责任确保整个结果集合可以适应内存。 不仅如此,还应该考虑通过电线传输的数据量。

所以这里是我的2美分..

在使用mongodb驱动程序处理大量数据的情况下,

  • 最好设置光标的“批量大小”。 例如, cursor1.batchSize(100, callback) 。 当设置光标的批量大小时,光标从数据库中批量获取数据(在上面的示例中为100个文档),而不是一次尝试获取完整的结果集。 通过批量执行,消耗相对较less的内存和/或通过电线传输的数据量减less,从而获得更好的性能。

  • 尽可能在查询中使用“预测”。 再次,通过正确的方式使用投影,我们阻止不必要的数据传输到客户端。 所以处理的数据量less,内存less,性能好。

  • 请注意关于游标的“sorting”。 调用“sorting”适用于find查询返回的完整文档列表。 如果列表很大,则可能会减慢查询的执行速度。 当您需要sorting时,请在sorting之前检查是否可以在查询中使用任何筛选器。 尽pipe不完全是客户端问题,但我们的查询应尽可能快地执行。

希望这个信息是有用的。

谢谢。