2015-04-24 2 views
0

Я использую следующие два способа получить количество документов по статусу. Вот мои два пути: -Query vs filter in mongodb and node.js peformance

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 раз (это просто пример кода в режиме реального времени у меня есть некоторые другие условия на основе цикла) и вернуть мне результат. Но я не знаю, для чего это лучший способ. Пожалуйста, помогите мне выбрать лучший способ, который лучше для производительности. Thanks

+0

Почему бы вам не попробовать как и измерить время, необходимое? – Philipp

ответ

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" } 
    }}, 

]);