iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

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

被MongoDB用Aggregate暴打的後端小菜雞日記-day16-陣列操作符(上)

  • 分享至 

  • xImage
  •  

接下來幾天,都會專注在各個資料型態相關的操作符,包含陣列、日期時間、文字,介紹有什麼好用的功能,今天先從陣列開始。

因為自己本身是寫JavaScript,看官方文件和陣列有關的操作符時,就在想其實很多語法都和JS很像,或是換一種寫法,但本質上還是做一樣的事。但大部分的操作符,其實在工作上我都沒有用過,個人比較偏好把資料庫的資料拉回server,然後再整理資料的格式。

因此接下來兩天講解,會以前後陣列資料的變化,讓大家感受一下每一個操作符,會對陣列資料進行怎樣的處理。

假設:我們有學生考試(test)的英文成績,將所有學生的成績寫進陣列內。

 { _id: 1, english: [56, 98, 63, 74, 21, 99, 38, 100, 78, 71] }

如果我們想要篩選出60分以上的成績資料出來,這時候就可以使用$filter幫我們篩選陣列資料,用法如下

test.aggregate([
  {
    $project: {
      english: {
        $filter: {
          input: "$english", // 帶入陣列資料
          as: "score", // 宣告參數來代表陣列每一個元素,之後使用要在參數名稱前面加上$$
          cond: {  // 寫入條件判斷,來篩選陣列資料
            $gte: ["$$score", 60]
          }
        }
      }
    }
  }
]);

// 最後回傳的資料
  { _id: 1, english: [98, 63, 74, 99, 100, 78, 71] }

如果我們想要確認是否有人考滿分,這時候就可以使用$in,確認陣列資料是否包含特定元素,用法如下

test.aggregate([
  {
    $project: {
      // $in 後面會接一個陣列,第一個寫要搜尋的值,第二個帶入陣列本身
      full_marks: { $in: [100, "$english"] }
    }
  }
]);

// 最後回傳的資料 (會以true或false來表示是否存在)
  { _id: 1, full_marks: true }

如果我們想要找出英文考最高和最低分的前三名,這時候就可以使用$maxN$minN這兩個操作符。其中n寫總共取幾個值,input要帶入陣列本身。

test.aggregate([
  {
    $project: {
      maxScores: { $maxN: { n: 3, input: "$english" } },
      minScores: { $minN: { n: 3, input: "$english" } }
    }
  }
]);
    
// 最後回傳的資料
  { _id: 1, maxScores: [100, 99, 98], minScores: [21, 38, 56] }

如果我們想要知道這次的英文考試,總共有多少學生參加,這時可以使用$size幫我們計算陣列長度。

test.aggregate([
  {
    $project: {
      student_amount: { $size: "$english" }
    }
  }
]);

// 最後回傳的資料
  { _id: 1, student_amount: 10 }

如果有一些學生在考試當天請假,老師另外找時間讓他們補考後,想要把考試成績和補考成績合併再一起,就可以使用$concatArrays幫我們把兩個陣列合併再一起。

// 原始資料
{ _id: 1, english: [56, 98, 63], make_up: [100, 98] }

// aggregate 指令
test.aggregate([
  {
    $project: {
      english: { $concatArrays: ["$english", "$make_up"] }
    }
  }
]);

// 最後回傳的資料
  { _id: 1, english: [ 56, 98, 63, 100, 98 ] }

ps.如果想要了解其他的陣列操作符,可以參考官方文件

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


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day15-$merge 將資料寫回資料庫
下一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day17-陣列操作符(中)
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言