使用以下数据结构,使用mongoDB的(v3.4(聚合框架,如何每15天对信息进行分组?
{
"_id" : ObjectId("5cb10a201e20af7503305fea"),
"user" : ObjectId("5b21240c4e71161fdd40b27c"),
"version" : NumberLong(2),
"value" : 42,
"itemRef" : ObjectId("5cb10a201e20af7503305fe9"),
"status" : "ACCEPTED",
"date" : ISODate("2019-04-13T11:00:00.466Z")
}
所需的输出为:
[date: 2019/01/01, totalValue:15],
[date: 2019/01/16, totalValue:5],
[date: 2019/02/01, totalValue:25],
[date: 2019/02/16, totalValue:30]
我发现使用 mongoDB 3.4 解决此问题的方法是使用 $cond + $dayOfMonth 来定义这个日期在哪个月的哪个部分。
db.contract.aggregate(
[
{$match:{...queryGoesHere...}},
{$project:
{dateText:
{$cond:
[
{$lte:[{$dayOfMonth:$date},15]},
['$dateToString': ['format': '%Y-%m-01', 'date': '$date']],
['$dateToString': ['format': '%Y-%m-16', 'date': '$date']]
]
}
value:'$value'
}
},
{$group:
{
_id:'$dateText',
total:{'$sum':1}
}
}
]
解决方案是在"dateText"的投影中,它首先使用$cond来确定日期是在月的第一部分还是在第二部分。它使用"$dayOfMonth"来确定这一点,该"会反映月份中的某一天。如果它小于或等于 15,则使用"$dateToString"按年-月-01 格式化日期,否则将其格式化为年-月-16。
希望这可以帮助将来的某人。