2016-07-25 4 views
1

私はnode.jsでmongooseを使用しています。私はトランザクションモデルと請求書モデルを持っています。 特定の請求書IDを持つすべてのレコードを取得したいと考えています。 imこのクエリを使用して請求書の照合トランザクションを取得します。すべての一致するレコードで特定の数値フィールドの合計を得る方法

Transaction.find({invoice_id: invoiceId}) 

イムは

[ 
    { 
    "_id": "5795e3f4f4a0fb8c1dff20ad", 
    "description": "This is a transcation", 
    "invoice_id": "5795db00bfa9d366194a454d", 
    "amount": 50 
    }, 
    { 
    "_id": "5795e3faf4a0fb8c1dff20ae", 
    "description": "This is a transcation", 
    "invoice_id": "5795db00bfa9d366194a454d", 
    "amount": 100 
    } 
] 

このフォーム内のレコードを取得しますが、問題は、私はまた、合計「量」フィールドトランザクション配列の各オブジェクトの値によってtotalAmountを取得したいということです。 私の望ましい結果は、集計関数の$和を使用して

[ 
    { 
    "_id": "5795e3f4f4a0fb8c1dff20ad", 
    "description": "This is a transcation", 
    "invoice_id": "5795db00bfa9d366194a454d", 
    "amount": 50 
    }, 
    { 
    "_id": "5795e3faf4a0fb8c1dff20ae", 
    "description": "This is a transcation", 
    "invoice_id": "5795db00bfa9d366194a454d", 
    "amount": 100 
    }, 
{ 
totalAmount: 150 
} 
] 

そのイムですが、私は私の問題はこれで解決する方法を知りません。

+1

'$ sum'集計アキュムレータ演算子の使い方を教えてください。 – chridam

答えて

1

あなたは、この目的の

の集計に使用して$グループなければなりません
Transaction.aggregate([{ 
       $group: { 
        _id:{ invoice_id:"$invoice_id" 
        }, 
        count: { 
         $sum: 1 
        }, 
        totalAmount: { $sum: "$amount" }, 
       } 
      }]).exec() 
0

このように、mongodbのmapReduce関数を使用することをお勧めします。次に例を示します。

var map = function() { emit(this.invoice_id, this.amount); }; 

var reduce = function(key, values) { 
    var totalAmount = 0; 
    for (var i + 0; i < values.length; i++) { totalAmount += values[i]; } 
    return totalAmount; 
}; 

var res = db.mapReduce(map, reduce); 

あなたは本当に、単一の請求書番号が必要な場合は、ここで使用するために更新された地図機能は次のとおりです。

var id = "1"; 
var map = function() { emit(id, this.amount); }; 
関連する問題