在之前兩篇文章中我們介紹了為什麼要使用索引,也提到索引可能會造成查詢效率下降及排序效率上升。這篇文章將會介紹兩種特別的索引:唯一值索引 unique index 及 超時刪除索引 TTL index。
先來看本文會使用到的範例資料:people.json
[
{
"name": "Jack",
"age": 27,
"hobby": [
{
"type": "Movie",
"rating": 3
},
{
"type": "Sports",
"rating": 6
}
]
},
{
"name": "Mark",
"age": 25,
"hobby": [
{
"type": "Movie",
"rating": 2
},
{
"type": "Cook",
"rating": 5
},
{
"type": "Music",
"rating": 4
}
]
}
]
使用 find()
來查看 people 這個 collection:db.people.find()
接著我們來查詢目前有哪些索引:db.people.getIndexes()
從查詢結果可以發現,目前已有一個索引為 "_id",而這個預設的索引目的是要讓 _id 不會有重複值,這個索引內的值都會是唯一值。
我們可以來創建一個唯一值的索引:db.people.createIndex({name: 1}, {unique: true})
透過以上指令創建唯一值索引,"name" 欄位就會變成唯一值,也就是不允許重複的值出現。此時如果新增已存在的 name 時,MongoDB 會報錯。例如,我們再新增一個 name: "Mark" 的資料:db.people.insertOne({name: "Mark", age: 30})
如圖,此時就會產生 "WriteError",因為原先的 people collection 中已存在 name 欄位為 "Mark" 的資料。
先新增一個 name: "Jack" 資料:db.ttl.insertOne({name: "Jack", createAt: new Date()})
使用 find
查看:db.ttl.find()
接著我們設置 TTL Index,設定資料會在 10 秒後刪除:db.ttl.createIndex({createAt: 1}, {expireAfterSeconds: 10})
我們反覆執行 find()
,在 10 秒過後會發現資料已被刪除。
今天介紹了兩種特別的索引,分別為「唯一值索引 Unique Index」及「超時刪除索引 TTL Index」,下一篇會接著介紹 聯合索引 Compound Index 及 文本索引 Text Index。