我有一个充满实体的集合,并且我正在使用MongoDB聚合来卸载我的后端进程所做的一些工作. 我设法转换了很多端点,但我缺少一个为我的时间表生成数据的端点.
我在聚合中使用以下代码片段来检索我的对象所需的格式:
{ $dateToString: { format: '%Y-%m', date: '$created_at' } }
我将能够从聚合中获得以下结果:
"timeline": {
"by_month": {
"2023-04": 5000,
"2023-03": 7000,
"2023-02": 10000,
"2023-01": 0,
"2022-12": 0,
"2022-11": 1000,
"2022-10": 2000,
"2022-09": 3000,
"2022-08": 1000,
"2022-07": 500,
"2022-06": 200,
"2022-05": 700
},
}
基于我在聚合中指定的一些条件.
当然,需要添加字段by_month,可能需要在聚合中添加$addFields指令.
对我来说,最困难的部分是:
- 从$DateToString结果创建MongoDB对象键
- 创建一个BY_MONTER键,即使是没有条目的月份
是否可以通过聚合直接实现这一点?现在我正在用光标遍历实体,但性能真的很差.
例如,给定以下示例文档:
[
{
"key": 1,
"created_at": "2023-04-02T11:53:19.779+00:00"
},
{
"key": 2,
"created_at": "2023-03-02T11:53:19.779+00:00"
},
{
"key": 3,
"created_at": "2023-01-02T11:53:19.779+00:00"
}
]
我希望得到以下输出:
"timeline": {
"by_month": {
"2023-04": 1,
"2023-03": 1,
"2023-02": 0,
"2023-01": 1,
"2022-12": 0,
"2022-11": 0,
"2022-10": 0,
"2022-09": 0,
"2022-08": 0,
"2022-07": 0,
"2022-06": 0,
"2022-05": 0
},
}
答案是惊人的,然而,如果我们有类似以下实体的东西:
[
{
"key": 1,
"created_at": ISODate("2023-04-02T13:53:19.779Z"),
"updated_at": ISODate("2023-04-02T13:53:19.779Z")
},
{
"key": 2,
"created_at": ISODate("2023-03-02T12:53:19.779Z"),
"updated_at": ISODate("2023-04-02T13:53:19.779Z")
},
{
"key": 3,
"created_at": ISODate("2023-01-02T12:53:19.779Z"),
"updated_at": ISODate("2023-04-02T13:53:19.779Z")
},
{
"key": 4,
"created_at": ISODate("2023-04-02T12:53:19.779Z"),
"updated_at": ISODate("2023-04-02T13:53:19.779Z")
}
]
是否有可能在同一查询中按不同的键进行分组,并获得以下结果?
"timeline": {
"created_by_month": {
"2023-04": 2,
"2023-03": 1,
"2023-02": 0,
"2023-01": 1,
"2022-12": 0,
"2022-11": 0,
"2022-10": 0,
"2022-09": 0,
"2022-08": 0,
"2022-07": 0,
"2022-06": 0,
"2022-05": 0
},
"updated_by_month": {
"2023-04": 4,
"2023-03": 0,
"2023-02": 0,
"2023-01": 0,
"2022-12": 0,
"2022-11": 0,
"2022-10": 0,
"2022-09": 0,
"2022-08": 0,
"2022-07": 0,
"2022-06": 0,
"2022-05": 0
},
}