如何获取具有所有匹配记录的特定数字字段的总和

时间:2016-07-25 10:47:33

标签: node.js mongodb mongoose

我正在使用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聚合函数,但我不知道我的问题将如何解决。

2 个答案:

答案 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); };