在mongodb和node.js中查询vs过滤器

时间:2015-04-24 10:26:11

标签: javascript node.js mongodb

我使用以下两种方法按状态计算某些文件。这是我的两种方式: -

collection.find({ Status: 'pending' }).count(function (e, pending) {
collection.find({ Status: 'open' }).count(function (e, open) {
collection.find({ Status: 'solved' }).count(function (e, solved) {
     var obj={
         solved:solved,
         open:open,
         pending:pending
     }
     res.send(obj);
   });
  });
});

,其次是: -

collection.find().toArray(function(e,data){
var open=data.filter(function(f){f.Status="open"}).length;
var solved=data.filter(function(f){f.Status="solved"}).length;
var pending=data.filter(function(f){f.Status="pending"}).length;
 var obj={
        solved:solved,
    open:open,
    pending:pending
      }
 res.send(obj);
});

我有循环,将运行此代码5次(这只是一个实际的示例代码我有一些基于循环的其他条件)并返回结果。 但我不知道哪种方法更好。请帮我选择性能更好的最佳方式。 感谢

1 个答案:

答案 0 :(得分:2)

您所拥有的是带宽和延迟之间的权衡。

第一个向数据库创建3个查询,这意味着从应用程序到数据库并返回3个网络往返。但是,每次往返只返回一个数字。

第二次只有一次往返,但它下载了该系列的全部内容。

哪个更好的解决方案取决于您的网络基础架构以及它提供的延迟和带宽。

但是,还有另一种方法可以为您提供两全其美的优势,这就是使用聚合管道来计算数据库中所有字段的数量。这是未经测试的示例:

db.collection.aggregate([
     // first project each document into a new one with separate 
     // fields for "open", "pending" and "solved" where the current
     // status gets the value "1" and all others the value "0"
     {$project: {
        open: {
           $cond: [ { $eq: [ "$Status", "open" ] }, 1, 0 ]
        },
        pending: {
           $cond: [ { $eq: [ "$Status", "pending" ] }, 1, 0 ]
        },
        solved: {
           $cond: [ { $eq: [ "$Status", "solved" ] }, 1, 0 ]
        }
     }},
     // then create a new document by creating the sum of the created document
     {$group: {
        _id:1,  // group all documents into one with the id "1"
        open: { $sum: "$open" },
        solved: { $sum: "$solved" },
        pending: { $sum: "$pending" }
     }},

]);