具有节点驱动程序

时间:2016-02-24 14:05:11

标签: node.js mongodb aggregation-framework

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

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

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

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

THX!

1 个答案:

答案 0 :(得分:1)

mongodb' mongodb'驱动程序的光标构造函数。

当' 每个 '(Cursor构造函数的原型方法)游标的方法被调用并传递回调函数,

  1. 它会触发数据库上的给定查询。通过线路,获取数据库返回的完整结果集,并在客户端(节点应用程序端)的内存中推入数组
  2. 然后调用每个 ' 的回调函数。方法通过传递上面数组中的每个元素作为参数。当然是节点风格。 callback(err, doc)
  3. 因此,需要注意的一点是 - 一旦从数据库接收到数据,构建数组并迭代它等等就会在应用程序结束时发生。加载和迭代数组可能是内存密集型的。调用者有责任确保整个结果集数组符合内存。不仅如此,还应考虑通过电线传输的数据量。

    所以这是我的2美分..

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

    • 最好设置批量大小'光标。例如,cursor1.batchSize(100, callback)。设置游标的批量大小时,游标将从数据库中批量获取数据(上例中的100个文档),而不是一次性尝试获取完整的结果集。通过分批进行,它会消耗相对较少的内存和/或减少通过线路传输的数据量,从而获得更好的性能。

    • 使用'投影'在查询中尽可能。同样,通过正确使用正确位置的投影,我们可以阻止不必要的数据传输到客户端。因此,处理大小的数据越少,内存越少,性能越好。

    • 请注意做'排序'在游标上。调用'排序'适用于查询查询返回的完整文档列表。如果列表很大,则可能会降低查询执行速度。当您需要进行排序时,请在排序之前检查是否可以在查询中使用任何过滤器。虽然不完全是客户端问题,但我们的查询应尽可能快地执行。

    希望这些信息有用。

    谢谢。