【发布时间】:2019-11-02 22:05:09
【问题描述】:
我有这个架构
var salesExpenseSchema = new Schema({
date : {
month: Number
},
sales: [{amount : Schema.Types.Decimal128}],
expenses: [{amount : Schema.Types.Decimal128}]
});
数据库记录的例子是这样的
{
_id:'5dbac5dfa1488240cbc4f838',
date:{month:11},
sales:[{amount:3000},{amount:5000}],
expenses: [{amount:5000},{amount:500}]
},
{
_id:'5dbac5dfa1488240cbc4f838',
date:{month:10},
sales:[{amount:2000},{amount:5000}],
expenses: [{amount:500},{amount:800}]
},
{
_id:'5dbac5dfa1488240cbc4f838',
date:{month:09},
sales:[{amount:2000},{amount:4000}],
expenses: [{amount:200},{amount:300}]
}
现在我想得到销售额和费用的总和。
我已将 Aggregate 与 $unwind 一起用于销售和费用,如下所示:
SalesExpense.aggregate([
{$unwind: "$sales"},
{$unwind: "$expenses"},
{$group:{
_id:'$_id',
sales:{$sum: "$sales.sellPrices"},
expenses:{$sum: "$expenses.amount"},
}
},
但问题是…… 如果一个数组文档有数据,另一个没有数据,那么它给0,即没有得到真正的总和。也就是说,如果有销售额但没有费用,则它们的总和变为 0,反之亦然。
我想获得销售额和费用的总和,无论其中一个没有数据。我如何做到这一点?
编辑:
我已经编辑了问题并在我的架构和数据库记录中添加了日期对象:我想根据每个月进行汇总,也就是说……每个月都有自己的销售额和费用。 .. 有点像一个时间表,每个月都有自己的销售额和费用。
我在 $project 之前尝试过使用 $group
{$group:{
_id:'$date.month'}}
但似乎没有给出预期的结果。
我想要这样的输出:
[
{
"month": "11",
"sales": {
"$numberDecimal": "8000"
},
"expenses": {
"$numberDecimal": "5500"
}
},
{
"month": "10",
"sales": {
"$numberDecimal": "7000"
},
"expenses": {
"$numberDecimal": "1100"
}
},
{
"month": "09",
"sales": {
"$numberDecimal": "6000"
},
"expenses": {
"$numberDecimal": "500"
}
},
]
我怎样才能做到这一点?
【问题讨论】:
-
这 {$sum: "$sales.sellPrices"} 不应该是 {$sum: "$sales.amount"} 吗?
-
@SuleymanSah 是的,应该是......我已经更新了我的问题
-
好的,我的回答对你有用吗?
-
是的,你是对的,现在我更新了答案,这个正在工作。
标签: node.js express mongoose aggregation-framework