接下來幾天,都會專注在各個資料型態相關的操作符,包含陣列、日期時間、文字,介紹有什麼好用的功能,今天先從陣列開始。
因為自己本身是寫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.如果想要了解其他的陣列操作符,可以參考官方文件
本篇文章同步放在我的部落格,大家有空可以進來逛逛