在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 } }]);
第一種寫法是原有的欄位名稱,後面接0
或false
,代表回傳的資料,不包含這個欄位。
第二種寫法是原有的欄位名稱,後面接1
或true
,代表回傳的資料,必須包含這一個欄位。
通常這兩種方法,我們會擇一使用,通常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.數值運算,不一定要帶特定欄位的數值,也可以自己數字和欄位值一起做運算。
本篇文章同步放在我的部落格,大家有空可以進來逛逛