【发布时间】:2017-10-07 11:15:54
【问题描述】:
我有一个 mongo/mongoose 模式,在查询时会重新运行诸如
之类的文档{ "_id" : ObjectId("5907a5850b459d4fdcdf49ac"), "amount" : -33.3, "name" : "RINGGO", "method" : "VIS", "date" : ISODate("2017-04-26T23:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.581Z"), "category" : "Not Set", "__v" : 0 }
{ "_id" : ObjectId("5907a5850b459d4fdcdf49ba"), "amount" : -61.3, "name" : "Amazon", "method" : "VIS", "date" : ISODate("2017-03-23T00:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.592Z"), "category" : "Not Set", "__v" : 0 }
{ "_id" : ObjectId("5907a5850b459d4fdcdf49ce"), "amount" : -3.3, "name" : "Tesco", "method" : "VIS", "date" : ISODate("2017-03-15T00:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.601Z"), "category" : "Not Set", "__v" : 0 }
{ "_id" : ObjectId("5907a5850b459d4fdcdf49cc"), "amount" : -26.3, "name" : "RINGGO", "method" : "VIS", "date" : ISODate("2017-03-16T00:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.600Z"), "category" : "Not Set", "__v" : 0 }
{ "_id" : ObjectId("5907a5850b459d4fdcdf49f7"), "amount" : -63.3, "name" : "Sky", "method" : "VIS", "date" : ISODate("2017-03-02T00:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.617Z"), "category" : "Not Set", "__v" : 0 }
{ "_id" : ObjectId("5907a5850b459d4fdcdf49be"), "amount" : -3.3, "name" : "RINGGO", "method" : "VIS", "date" : ISODate("2017-03-22T00:00:00Z"), "importDate" : ISODate("2017-05-01T21:15:49.593Z"), "category" : "Not Set", "__v" : 0 }
我想写一个查询,提供每个供应商 ("name" : "Amazon") 的年、月和周支出,例如供应商 RINGGO:
- 2017 年有 3 次支出 33.3+26.3+3.3,因此每年的总支出为 59.9
- 2017-03 月有两次支出,总和为 26.3+3.3,因此每月总支出为 26.6
- 每笔支出都在不同的周内,因此每周总金额将是(例如)第 12 周 26.3、第 13 周 3.3、第 15 周 33.3
我可以写一个查询比如
db.statements.aggregate(
[
{ $group : { _id : "$name", amount: { $push: "$amount" } } }
]
)
这将按供应商名称汇总所有支出 (amount),但我不知道如何按如上所述按年、月、周细分。
根据评论进行编辑 我不确定结果可能是什么形状,但理想情况下应该是下面这样:
我需要年、月、周等,以便查询可以由 url 驱动(例如domain.com/vendorname/2017、domain.com/vendorname/2017/3、domain.com/vendorname/2017/3/12)
我还想要每年/每月/每周的个人支出和总支出,因为我想将它们打印到页面上。
{ "_id" :
{ "year" : 2017,
"month" : 3,
"week" : 12 },
"name": "RINGGO", //vendor name
"YearlySpends":[ 33.3, 26.3, 3.3]
"totalYearlylyAmount" : [ 59.9]
"MonthlySpends":[ 26.3, 3.3]
"totalMonthlyAmount" : [ 26.6]
"WeeklylySpends":[ 3.3]
"totalWeeklylyAmount" : [3.3]
}
【问题讨论】:
-
如果您可以添加您的预期结果 JSON 来补充示例数据,那就太棒了,这样就可以使用该预期输出轻松推断聚合管道。
-
@chridam 我已经编辑了这个问题,试图让结果 JSON 看起来像什么
-
顺便说一下
33.3+26.3+3.3 = 62.9不是59.9
标签: node.js mongodb mongoose mongodb-query aggregation-framework