2016-07-25 58 views
1

即時使用mongoose與node.js,我有交易模型和發票模型。 我想獲得具有特定發票編號的所有記錄。 即時通訊使用此查詢來獲取發票的匹配交易。如何獲得特定數字字段與所有匹配記錄的總和

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 
    } 
] 

但問題的記錄是,我也希望通過總和交易陣列的每個對象「量」字段中的值來獲得總金額。 我期望的結果是使用

[ 
    { 
    "_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 
} 
] 

IM的聚合函數$總和,但我不知道我的問題將如何解決這個。

+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); }; 
相關問題