MongoDB $switch 語法使用 與 使用資料的其他欄位

新增欄位

新增欄位目前我都使用 $set居多,已經很少在用 $addFields

使用其他欄位的資料

在實務上我們很常有類似的需求或查詢,根據已經存在的資料中的欄位A,經過運算後存在欄位B,例如:

1
2
3
4
5
{
_id: "Y000000001",
"LastName": "Chou",
"FirstName": "MingYiPie"
}

在功能上線後,發現某個頁面只需要呈現完整名字,也就是 FirstName + 空格 + LastName,礙於一些”特殊”原因,只需要在資料庫中儲存成一個欄位,如下:

1
2
3
4
{
_id: "Y000000001",
"FullName": "MingYiPie Chou"
}

這時候要上個 Data Patch 將所有資料改成上述格式該怎麼做?

思路

  • 取出 LastName, FirstName 組合在一起
  • 寫入該筆資料
  • 刪除 LastName, FirstName

這邊的關鍵語法應該是 Signle Dollar sign $ 的使用,例如我們要使用已存在的欄位就是 $field,於是就能夠完成組合的語法囉!

1
'$concat': ['$LastName' , ' ' , '$FirstName' ]

完整語法:

1
2
3
4
5
6
db.test.update(
{ "_id" : "Y000000001"} ,
[
{ $set : { "FullName" : { "$concat": ['$LastName' , ' ' , '$FirstName' ] } } }
]
);

刪除欄位

這邊直接演示刪除 LastName, FirstName

1
2
3
4
db.test.update(
{ "_id" : "Y000000001"} ,
{ $unset : { LastName: 1, FirstName: 1 } }
);

$switch 的使用

這邊我們結合了上面的內容,想要替這些員工加上一個 Level 欄位,此欄位是透過 Seniority 來做判斷,如果都不符合的話會進入 default 條件。(這只是範例,條件並沒有全部涵蓋喔!!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
db.test.updateMany({"Seniority": {$exists:true}},
[{
$set: { "Level":
{
$switch: {
branches: [
{ case: { $gt: ["$Seniority", 20 ]}, then: 'OldFriedBreadStick' },
{ case: { $lt: ["$Seniority", 5 ]}, then: 'FreshPeople' },
],
default: 'Call_DBA'
}
}
}
}]
)

補充:

可以使用 update 語法,記得去掉 [ ] 以及加上 , { multi:true }

基本上學會使用其他欄位後,就能夠任意搭配其他語法,端看需求是什麼了。

1
murmur...MQL 偵錯有點辛苦,同樣功能的語法又有不同寫法
  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。