索引创建基础

请参阅以下事务集合。

> 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"
    }
]