哪个是更快的 MogoDB 聚合或自实现的“For”循环?

Hes*_*era 1 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
        }]
    }
}}
Run Code Online (Sandbox Code Playgroud)

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

[
        {
          "status": 1,
          "delay": 2.83,
          "ts": 1308058080
        },{
          "status": 1,
          "delay": 5.77,
          "ts": 1308060720
        }
]
Run Code Online (Sandbox Code Playgroud)

一种方法是使用 MongoDB 聚合函数。

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

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

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

Abh*_*hak 5

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

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