結束連續三天陣列操作符的介紹,讓我們往下一個主題邁進,介紹日期時間相關的操作符,今天主要專注在取得一個日期資料中,它的年份、月份...等等相關的操作。
以一個日期的資料"2022-09-16T14:27:20.300Z"
來做舉例,列出比較常見的用法。
$year
:取得年份,現在是2022年,會回傳2022。$month
:取得月份,現在是9月,會回傳9。$dayOfMonth
:取得日期是幾號,因為是9/16,所以回傳16。$hour
:取得時間,因為是14:27:20.300,所以小時會顯示14。$minute
:取得時間,因為是14:27:20.300,所以分鐘會顯示27。$second
:取得時間,因為是14:27:20.300,所以秒數會顯示20。$millisecond
:取得時間,因為是14:27:20.300,所以毫秒數會顯示300。$dayOfYear
:計算從2022-01-01到2022-09-16經過幾天,結果會回傳259。$dayOfWeek
:計算2022-09-16會是星期幾,回傳格式是 1 (星期日) ~ 7 (星期六)$week
:計算從2022-01-01到2022-09-16經過幾週,結果會回傳37。db.collection.aggregate([
{ $addFields: { date: new Date("2022-09-16T14:27:20.300Z") } },
{
$project: {
year: { $year: "$date" },
month: { $month: "$date" },
day: { $dayOfMonth: "$date" },
hour: { $hour: "$date" },
minutes: { $minute: "$date" },
seconds: { $second: "$date" },
milliseconds: { $millisecond: "$date" },
dayOfYear: { $dayOfYear: "$date" },
dayOfWeek: { $dayOfWeek: "$date" },
week: { $week: "$date" }
}
}
]);
// 最後回傳的資料
{
_id: 1, year: 2022, month: 9, day: 16,
hour: 14, minutes: 27, seconds: 20, milliseconds: 300,
dayOfYear: 259, dayOfWeek: 6, week: 37
}
有了這些基本概念,我們可以來舉一個實務上可能會用到的情境。
例如:我們現在有多筆商品販售的資料。
{
id: 1,
product: "鍵盤",
price: 1600,
amount: 12,
date: new Date("2022-09-16T14:27:20.300Z")
},
{
id: 2,
product: "耳機",
price: 1300,
amount: 8,
date: new Date("2022-08-06T14:27:20.300Z")
},
{
id: 3,
product: "滑鼠",
price: 300,
amount: 19,
date: new Date("2022-09-08T14:27:20.300Z")
},
{
id: 4,
product: "筆電",
price: 21000,
amount: 6,
date: new Date("2022-08-27T14:27:20.300Z")
},
{
id: 5,
product: "手機",
price: 8000,
amount: 8,
date: new Date("2022-01-19T14:27:20.300Z")
}
經理希望我們分析每月的銷售狀況,並且進行排序,可以使用以下指令。
order.aggregate([
{
$addFields: {
total: { $multiply: ["$price", "$amount"] },
month: { $month: "$date" }
}
},
{
$group: {
_id: "$month",
month: { $first: "$month" },
total_sale: { $sum: "$total" }
}
},
{ $sort: { "total_sale": -1 } }
]);
// 最後回傳的資料
{ _id: 8, month: 8, total_sale: 136400 },
{ _id: 1, month: 1, total_sale: 64000 },
{ _id: 9, month: 9, total_sale: 24900 }
aggregate主要的流程是,先將price和amount相乘,計算每一筆訂單的消費金額,同時取得交易是在幾月進行,再利用月份進行分組,並且計算出每個月的銷售總合,最後在按照銷售額進行排序。
ps.如果想要提前了解更多日期時間操作符,可以參考官方文件,明天還會繼續介紹相關的應用。
本篇文章同步放在我的部落格,大家有空可以進來逛逛