2017-03-18 10 views
1

私はこの特定のユーザーからのすべての「所得」を検索するこのマングースメソッド/クエリを持っていますが、「所得」の日付が現在の月。Mongoose、Node.js文書の束からのフィールドの合計を取得

コード:

module.exports.getMonthlyIncome = function(userId, callback){ 
const now = new Date(); 

const year = now.getFullYear(); 
const month = now.getMonth(); 
const date = now.getDate(); 

const start = new Date(year, month, 1); 
const end = new Date(year, month, 30); 

Income.find({owner: userId, date: { $gte: start, $lt: end }}, callback); 
} 

結果:

[ 
{ 

"_id": "58cc9ee50fe27e0d2ced5193", 
"amount": 600, 
"description": "Ripco Salary", 
"owner": "58cc9e950fe27e0d2ced5192", 
"__v": 0, 
"date": "2017-03-17T00:00:00.000Z" 
}, 

{ 

"_id": "58ccc3cfca6ea10980480d42", 
"amount": 450, 
"description": "Another Ripped co salary", 
"owner": "58cc9e950fe27e0d2ced5192", 
"__v": 0, 
"date": "2017-03-26T00:00:00.000Z" 
} 

] 

結果は、予想通りである私に月の間に、特定のユーザーに属する2所得の文書を提供します。

ここで、これらの文書からすべての「金額」フィールドの合計を取得したいと考えています。

したがって、この場合には、合計がどのように私はマングースでこれを達成するであろう1050

でしょうか?

何か助けていただければ幸いです。

答えて

2

mongoose Aggregation pipelineを使用すると、複数のドキュメントにわたってamountの合計を計算できます。

$matchを使用すると、クエリ条件と一致させるために、複数のドキュメントの合計を計算するのに$groupを使用する必要があります。

Income.aggregate([{ 
    $match : { $and : [ owner: userId, date: { $gte: start, $lt: end } ] }, 
},{ 
    $group : { 
     _id : null, 
     total : { 
      $sum : "$amount" 
     } 
    } 
}],callback); 

2

これには2通りの方法があります。

1.集約クエリの使用: mongodbの新機能のようです。だから、私はあなたのためにこのアプローチを提案しません。このアプローチは、別の答えで正しくカバーされ、完全にうまくいくはずです。それをチェックしてください!あなたのコードを書き換え

module.exports.getMonthlyIncome = function(userId, callback){ 
const now = new Date(); 

const year = now.getFullYear(); 
const month = now.getMonth(); 
const date = now.getDate(); 

const start = new Date(year, month, 1); 
const end = new Date(year, month, 30); 
// Including underscore-node 
const _ = require('underscore-node'); 
Income.find({owner: userId, date: { $gte: start, $lt: end }}, function(err, results){ 
    if (err) { 
    //handle error 
    } 

    let sum = _.reduce(results, function(memo, reading){ return memo + reading.amount; }, 0); 
    // Explaination: 
    // reduce() accepts an array and a callback function. 
    // So, we are passing the array in "results" 
    // In the callback function, do not touch "memo" variable 
    // Every single object in "results" array will be passed 
    // to callback function in the "reading" variable 
}); 

は、このコードがあなたのお役に立てば幸いですunderscore-nodeを使用して

2!

関連する問題