索引建立基礎

請參閱以下事務集合。

> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10,  fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10,  fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10,  fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});

getIndexes() 函式將顯示集合可用的所有索引。

db.transactions.getIndexes();

讓我們看一下上面語句的輸出。

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "documentation_db.transactions"
    }
]

事務收集已有一個索引。這是因為 MongoDB 在建立集合期間在 _id 欄位上建立了唯一索引_id 索引可防止客戶端為 _id 欄位插入兩個具有相同值的文件。你不能在 _id 欄位上刪除此索引。

現在讓我們為 cr_dr 欄位新增一個索引;

db.transactions.createIndex({ cr_dr : 1 });

索引執行的結果如下。

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

createdCollection 自動指示操作是否建立了集合。如果集合不存在,MongoDB 將建立集合作為索引操作的一部分。

讓我們再次執行 db.transactions.getIndexes();

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "documentation_db.transactions"
    },
    {
        "v" : 1,
        "key" : {
            "cr_dr" : 1
        },
        "name" : "cr_dr_1",
        "ns" : "documentation_db.transactions"
    }
]

現在你看到事務集合有兩個索引。我們建立的預設 _id 索引和 cr_dr_1。該名稱由 MongoDB 分配。你可以設定自己的名稱,如下所示。

db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})

現在 db.transactions.getIndexes(); 會給你三個指數。

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "documentation_db.transactions"
    },
    {
        "v" : 1,
        "key" : {
            "cr_dr" : 1
        },
        "name" : "cr_dr_1",
        "ns" : "documentation_db.transactions"
    },
    {
        "v" : 1,
        "key" : {
            "cr_dr" : -1
        },
        "name" : "index on cr_dr desc",
        "ns" : "documentation_db.transactions"
    }
]

建立索引時,{ cr_dr : -1 } 1 表示索引將為 ascending 順序,-1 表示 descending 順序。

Version >= 2.4

雜湊索引

索引也可以定義為雜湊。這在相等查詢上更具效能,但對範圍查詢效率不高 ; 但是,你可以在同一欄位上定義雜湊和升序/降序索引。

> db.transactions.createIndex({ cr_dr : "hashed" });    

> db.transactions.getIndexes(
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "documentation_db.transactions"
    },
    {
        "v" : 1,
        "key" : {
            "cr_dr" : "hashed"
        },
        "name" : "cr_dr_hashed",
        "ns" : "documentation_db.transactions"
    }
]