2014-09-25 40 views
1

比方说,我有以下的MongoDB文档。哪个更快,MogoDB聚合还是自我实现“For”循环?

{ 
(...) 
"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应用程序)的整个数据阵列和运行一个循环以滤除我想要的值。

撇开实施简单性,哪种方法会更有效率或产生更快的结果?为什么?

+2

这实际上是相当主观的,这里的一般提示是“哪个最好”并不是真正的问题前提。现实倾向于指出,您的“数据库”平台“应该”比您的“应用程序”平台具有更强的处理能力。更不用说,你在两者之间传输不必要的数据。试图在这里决定是否真的有一个真正的问题。因为如果你没有“期待”数据库去做,那么为什么要使用数据库呢? – 2014-09-25 11:03:42

回答

3

一般来说,MongoDB Aggregate函数预计会更快,因为它是用C语言实现的,并且经过高度优化,并且不断发展,以便更快。尽管如此,就像Neil提到的那样,除非你正在构建关键任务,否则良好的软件工程实践应该优先考虑。预计数据库将完成所有繁重的工作,并避免不必要的数据传输。代码的复杂性和抽象性也应考虑在内。在这种情况下,由于MongoDb确实提供了一个查询来复制数据库本身的逻辑,你应该在数据库服务器上执行它。

相关问题