iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 19

被MongoDB用Aggregate暴打的後端小菜雞日記-day19-日期時間操作符(上)

  • 分享至 

  • xImage
  •  

結束連續三天陣列操作符的介紹,讓我們往下一個主題邁進,介紹日期時間相關的操作符,今天主要專注在取得一個日期資料中,它的年份、月份...等等相關的操作。

以一個日期的資料"2022-09-16T14:27:20.300Z"來做舉例,列出比較常見的用法。

  1. $year:取得年份,現在是2022年,會回傳2022。
  2. $month:取得月份,現在是9月,會回傳9。
  3. $dayOfMonth:取得日期是幾號,因為是9/16,所以回傳16。
  4. $hour:取得時間,因為是14:27:20.300,所以小時會顯示14。
  5. $minute:取得時間,因為是14:27:20.300,所以分鐘會顯示27。
  6. $second:取得時間,因為是14:27:20.300,所以秒數會顯示20。
  7. $millisecond:取得時間,因為是14:27:20.300,所以毫秒數會顯示300。
  8. $dayOfYear:計算從2022-01-01到2022-09-16經過幾天,結果會回傳259。
  9. $dayOfWeek:計算2022-09-16會是星期幾,回傳格式是 1 (星期日) ~ 7 (星期六)
  10. $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.如果想要提前了解更多日期時間操作符,可以參考官方文件,明天還會繼續介紹相關的應用。

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day18-陣列操作符(下)
下一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day20-日期時間操作符(下)
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言