索引创建基础
请参阅以下事务集合。
> 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"
}
]