iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
AI & Data

從入門到精通 MongoDB系列 第 22

Day22: 索引 index(3) - Unique Index 與 TTL Index

  • 分享至 

  • twitterImage
  •  

在之前兩篇文章中我們介紹了為什麼要使用索引,也提到索引可能會造成查詢效率下降及排序效率上升。這篇文章將會介紹兩種特別的索引:唯一值索引 unique index超時刪除索引 TTL index


唯一值索引 Unique 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" 的資料。


超時刪除索引 TTL Index

什麼是「超時刪除索引」?

  • single-field index:只能對 document 中的某一個欄位去設置 TTL index
  • 規定 document 裡每條紀錄的生存時間,在特定時間後會自動刪除

範例

先新增一個 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


上一篇
Day21: 索引 index(2) - index 的優點與缺點
下一篇
Day23: 索引 index(4) - 聯合索引 Compound Indexes 與文本索引 Text Index
系列文
從入門到精通 MongoDB26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言