我正在使用mongoose和node.js,我有交易模型和发票模型。 我想获得具有特定发票ID的所有记录。 即时通讯使用此查询来获取发票的匹配交易。
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
}
]
但问题是我还希望通过事务数组的每个对象中的“amount”字段值得到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
}
]
我使用$ sum聚合函数,但我不知道我的问题将如何解决。
答案 0 :(得分:1)
您应该为此目的使用聚合和$ group
Transaction.aggregate([{
$group: {
_id:{ invoice_id:"$invoice_id"
},
count: {
$sum: 1
},
totalAmount: { $sum: "$amount" },
}
}]).exec()
答案 1 :(得分: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);
如果您真的想要一个发票ID,请使用以下更新的地图功能:
var id = "1";
var map = function() { emit(id, this.amount); };