在Mongodb中根据日历周显示结果



我有一个名为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-21end_date作为20-06-21,如果没有收入,则为0,否则为给定周的总价,依此类推,为全年或月份的其他周组。

您可以使用$week运算符按周号对总价进行分类,但在MongoDB中很难获得周的开始日期和结束日期,我建议您使用客户端语言从周号中获得开始日期和终止日期。

  • $groupcreatedAt的一周使用$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游乐场示例执行

最新更新