哪个更快,MongoDB聚合或自我实现“For”循环?

时间:2014-09-25 10:33:19

标签: mongodb aggregation-framework

我们说我有以下MongoDB文档。

{
(...)
"services": {
    "TCP80": {
      "data": [{
          "status": 1,
          "delay": 3.87,
          "ts": 1308056460
        },{
          "status": 1,
          "delay": 2.83,
          "ts": 1308058080
        },{
          "status": 1,
          "delay": 5.77,
          "ts": 1308060720
        }]
    }
}}

我希望检索"数据"中的所有条目。其中" ts"值大于" 1308056460"。因此,预期结果将是,

[
        {
          "status": 1,
          "delay": 2.83,
          "ts": 1308058080
        },{
          "status": 1,
          "delay": 5.77,
          "ts": 1308060720
        }
]

执行此操作的一种方法是使用MongoDB聚合函数。

db.test.aggregate(
   {$match : {}},
   {$unwind: "$services.TCP80.data"},
   {$match: {"services.TCP80.data.ts": {$gte: 1308060720}}}
 );

另一个是通过中间层(node.js应用程序)检索整个数据数组并运行循环来过滤掉我想要的值。

不考虑实现简单性,哪种方法更有效或产生更快的结果?为什么?

1 个答案:

答案 0 :(得分:4)

一般来说,MongoDB Aggregate函数预计会更快,因为它是用C实现的,并且经过高度优化,并且不断开发以更快地运行。

话虽如此,即使事实并非如此,正如Neil所提到的,除非你正在构建关键任务,否则优秀的软件工程实践应该优先考虑。数据库应该完成所有繁重的工作,并且应该避免不必要的数据传输。代码复杂性和抽象也应该考虑在内。在这种情况下,由于MongoDb确实提供了一个查询来复制数据库本身的逻辑,你应该在数据库服务器上做这件事。