我在mongodb上保存了这样的订单:
_id: 5feb0b6cc0ea5745f8d931e3
...
totalPrice: 2935.02
createdAt:2020-12-25T10:56:44.798+00:00
如果今天是25/01/2021,我需要计算这周的每一天有多少订单。
的例子:
25/01/2021: 5 (orders)
26/01/2021: 21 (orders)
27/01/2021: 24 (orders)
...
31/01/2021: 22 (orders)
谢谢你:)
如果我理解正确的话,您想要这样做:给定一年中的一周,按天分组获取该周的所有结果。
则需要执行聚合查询:
- 使用
$set
和$week
获取每个文档的星期。 - 使用
$match
查找一年中所需的星期。 - 再次使用
$set
,以获得日期作为字符串,不包括时间值,并仅使用:年-月-日选择。 - 使用
$sum
按日期分组以获得总数。 - 可选地包括输出字段的名称。
下面是基于当前日期查找当前星期的代码:
let today = new Date();
let oneJan = new Date(today.getFullYear(), 0, 1);
let numberOfDays = Math.floor((today - oneJan) / (24 * 60 * 60 * 1000));
let result = Math.ceil(( today.getDay() + 1 + numberOfDays) / 7);
db.collection.aggregate([
{ "$set": { "date": { "$week": "$createdAt" }}},
{ "$match": { "date": your_desired_week }},
{ "$set": { "date": {
"$dateToString": { "format": "%Y-%m-%d", "date": "$createdAt" }}}},
{ "$group": { "_id": "$date", "orders": { "$sum": 1 }}},
{ "$project": { "date": "$_id", "orders": 1, "_id": 0 }}
])
例子
应该是这个:
{
$group: {
_id: {
$dateFromParts: {
'isoWeekYear': { $isoWeekYear: "$createdAt" }, 'isoWeek': { $isoWeek: "$createdAt" }
}
},
orders: { $sum: 1 }
}
}
试试这个查询。
var today = new Date();
var first = today.getDate() - today.getDay();
var firstDayWeek = new Date(today.setDate(first));
var lastDayWeek = new Date(today.setDate(first + 6));
db.getCollection('Collection').aggregate([{
$project: {
date: {
$dateFromString: {
dateString: '$createdAt'
}
}
}}, {
$match: {
"date": {
$lt: lastDayWeek,
$gt: firstDayWeek
}
},
{$group:{_id:"$createdAt",count:{$sum:1}}}}])