索引建立基礎
請參閱以下事務集合。
> 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"
}
]