ensureIndex(data)
当我调用典型数据时究竟会发生什么data:{name: "A",age:"B", job : "C"}
?它会在这三个字段上创建一个复合索引,还是只创建一个适用于请求数据中的任何内容或完全不同的索引?
问问题
27715 次
2 回答
53
您可以执行以下任一操作:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
这在indexes-on-embedded-fields和indexes 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 回答