iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

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

被MongoDB用Aggregate暴打的後端小菜雞日記-day6-用$project新增欄位

  • 分享至 

  • xImage
  •  

在day2的時候,有介紹到$project可以用來決定我們想要回傳的資料有哪些,今天會再跟深入介紹$project的用法,以及可以跟它搭配使用的操作符。

例如:我們現在有一筆學生資料,我們只回傳學生的成績和id就好,其實有兩種寫法。

{ _id: 1, name: "cindy", math: 85, english: 56 }
// 寫法一
student.aggregate([{ $project: { name: 0 } }]);

// 寫法二
student.aggregate([{ $project: { _id: 1, math: 1, englis: 1 } }]);

第一種寫法是原有的欄位名稱,後面接0false,代表回傳的資料,不包含這個欄位。
第二種寫法是原有的欄位名稱,後面接1true,代表回傳的資料,必須包含這一個欄位。
通常這兩種方法,我們會擇一使用,通常document的欄位很多,只是不要其中一個欄位,我就會使用{ $project: { <field>: 0 } }這個方法,反之亦然。

$project同時還有另一個功用,是可以新增欄位,比如說我們想要算學生的成績總和,並且回傳學生的姓名和總分即可,會使用以下指令。

student.aggregate([
  {
    $project: {
      name: 1,
      total: { $add: ["$math", "$english"] }
    }
  }
]);

我們用$project指定要回傳name這個欄位,以及新增一個欄位total,寫入英文和數學成績的總合,如果要做兩個欄位以上的值相加,會使用到$add這個操作符,後面接一個陣列裡面寫入要進行加總的欄位名稱。

ps. _id這個欄位mongodb預設都會回傳,不必特別寫_id: 1,但在新增欄位的時候,如果同時還有其他的欄位資料要保留,就一定要寫上 <field>: 1


除了加法,當然還有$subtract(減法)、$multiply(乘法)、$divide(除法)、以及$mod(取餘數)的操作符可以使用,基本上這幾個操作符的用法都十分的類似。

例如:我們現在有一筆商品資料

{ _id: 1, name: "鍵盤", price: 1000, amount: 2 }

老闆說如果我們把庫存的兩把鍵盤買回去,可以打8折,以及剛好現在是週年慶,單筆消費可以現折100元,如果我們要算消費的總額,可以用以下的寫法,算出total=1500。

product.aggregate([
  { $match: { name: "鍵盤" } },
  {
    $project: {
      name: 1,
      total: {
        $subtract: [{ $multiply: ["$price", "$amount", 0.8] }, 100]
      }
    }
  }
]);

ps.數值運算,不一定要帶特定欄位的數值,也可以自己數字和欄位值一起做運算。

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


上一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day5-轉變資料格式
下一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day7-用$group將資料分組(上)
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言