我有一个名为Bookings 的MongoDB集合
{
"_id" : ObjectId("5fca982d219fee6f00e631a0"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-04T20:12:29.117Z")
}
{
"_id" : ObjectId("5fca990b219fee6f00e631a1"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-04T20:16:11.925Z")
}
{
"_id" : ObjectId("5fcab925a912a2064fe7b916"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-04T22:33:09.958Z")
}
{
"_id" : ObjectId("5fcab938a912a2064fe7b917"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-04T22:33:28.641Z")
}
{
"_id" : ObjectId("5fcab94aa912a2064fe7b918"),
"createdAt" : ISODate("2020-12-04T22:33:46.118Z")
}
{
"_id" : ObjectId("5fcb73e0e396cf18e6141dc6"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-05T11:49:52.544Z")
}
{
"_id" : ObjectId("5fcb73eee396cf18e6141dc7"),
"price" : 45.9,
"createdAt" : ISODate("2020-12-05T11:50:06.914Z")
}
{
"_id" : ObjectId("5fcbee785ef206248fa9513e"),
"price" : 35.7,
"createdAt" : ISODate("2020-12-05T20:32:56.508Z")
}
{
"_id" : ObjectId("5fcbf0045ef206248fa9513f"),
"price" : 2047.66,
"createdAt" : ISODate("2020-12-05T20:39:32.369Z")
}
我需要根据一周和该周的集体价格显示数据。如果我使用聚合管道,它只会给我预订的日期范围。
{$group: {
_id: {
$week: "$createdAt"
},
start_date: {$min: "$createdAt"},
end_date: {$max: "$createdAt"}
}}
假设前一周从14-06-21
开始,到20-06-21
结束相反,我想要一个结果,它实际上包括start_date
作为14-06-21
,end_date
作为20-06-21
,如果没有收入,则为0,否则为给定周的总价,依此类推,为全年或月份的其他周组。
您可以使用$week
运算符按周号对总价进行分类,但在MongoDB中很难获得周的开始日期和结束日期,我建议您使用客户端语言从周号中获得开始日期和终止日期。
$group
由createdAt
的一周使用$week
算子得到,并由$sum
得到总价
db.collection.aggregate([
{
$group: {
_id: { $week: "$createdAt" },
totalPrice: { $sum: "$price" }
}
}
])
游乐场
要获取一周的开始日期,可以使用$dateToString
运算符,并在format
中传递%g
和%v
,分别表示ISO年和周。
类似地,将518400000
(以毫秒为单位的6天(添加到一周的开始日期以获得结束日期。
此外,这两个操作将仅在$group
阶段的_id
字段内工作,因此解析_id
键的子对象以获得所需的数据值。weekNo
密钥对于$group
阶段是无用的,但如果需要,请保留它。
db.collection.aggregate([
{
$group: {
_id: {
"weekNo": {
$week: "$createdAt"
},
"start_date": {
"$dateFromString": {
"dateString": {
"$dateToString": {
"date": "$createdAt",
"format": "%G/%V",
},
},
"format": "%G/%V"
}
},
"end_date": {
"$add": [
{
"$dateFromString": {
"dateString": {
"$dateToString": {
"date": "$createdAt",
"format": "%G/%V",
},
},
"format": "%G/%V"
}
},
518400000,
],
},
},
totalPrice: {
$sum: "$price"
}
}
}
])
Mongo游乐场示例执行