42

ensureIndex(data)当我调用典型数据时究竟会发生什么data:{name: "A",age:"B", job : "C"}?它会在这三个字段上创建一个复合索引,还是只创建一个适用于请求数据中的任何内容或完全不同的索引?

4

2 回答 2

53

您可以执行以下任一操作:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

这在indexes-on-embedded-fieldsindexes on subdocuments下的文档中进行了讨论

子文档部分的重要部分是“在对子文档执行相等匹配时,字段顺序很重要,并且子文档必须完全匹配。”

这意味着 2 个索引对于简单查询是相同的。

但是,正如子文档示例所示,如果您只是索引整个子文档而不是特定字段,然后执行比较运算符($gte如索引一个特定的子字段,你会得到一个不太灵活但可能更有用的索引。

这实际上完全取决于您的用例。

无论如何,一旦您创建了索引,您就可以检查创建的内容:

> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

正如您从输出中看到的那样,它创建了一个名为的新键data.name_1_data.age_1_data.job_1_id_始终创建索引)。

如果你想测试你的新索引,那么你可以这样做:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

主要的是,您可以看到使用了新索引(光标字段中的BtreeCursor data.name_1_data.age_1_data.job_1表明这种情况)。如果你看到"cursor" : "BasicCursor",那么你的索引没有被使用。

有关更多详细信息,请查看此处

于 2013-05-27T09:51:24.740 回答
-3

你可以试试这个:

db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
于 2015-01-16T09:24:53.397 回答