ensureIndex(data)当典型数据看起来像我打电话时到底发生了什么data:{name: "A",age:"B", job : "C"}?它会在这三个字段上创建一个复合索引,还是只在请求数据的任何内容或完全不同的东西时才创建一个索引?
jim*_*ary 47
你可以这样做:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Run Code Online (Sandbox Code Playgroud)
子文档部分的重要部分是"当在子文档上执行相等匹配时,字段顺序事项和子文档必须完全匹配."
这意味着简单查询的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"
}
Run Code Online (Sandbox Code Playgroud)
]
从输出中可以看出,它创建了一个名为的新键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
Run Code Online (Sandbox Code Playgroud)
主要的是你可以看到你的新索引被使用了(光标字段中的BtreeCursor data.name_1_data.age_1_data.job_1就是这样的情况).如果你看到"cursor" : "BasicCursor",那么你的索引没有被使用.
有关详细信息,请查看此处.
| 归档时间: |
|
| 查看次数: |
21902 次 |
| 最近记录: |