当典型数据看起来像ensureIndex(data)
时,当我致电data:{name: "A",age:"B", job : "C"}
时会发生什么?它会在这三个字段上创建一个复合索引,还是只在请求数据中的任何内容或完全不同的内容时才创建一个索引?
答案 0 :(得分:44)
你可以这样做:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
indexes-on-embedded-fields和indexes on sub documents
下的文档对此进行了讨论子文档部分的重要部分是'当在子文档上执行相等匹配时,字段顺序很重要且子文档必须完全匹配。'
这意味着简单查询的2个索引是相同的。
但是,正如子文档示例所示,如果您只是索引整个子文档而不是特定字段,然后执行比较运算符(如{),则可以获得一些有趣的结果(您可能不会期望) {1}}) - 如果您索引特定的子字段,则会获得灵活性较低但可能更有用的索引。
这完全取决于您的使用案例。
无论如何,一旦你创建了索引,就可以检查创建的内容:
$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_
主要的是你可以看到你的新索引被使用了(光标字段中的 BtreeCursor data.name_1_data.age_1_data.job_1 表示是这种情况)。如果您看到> 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
,则表示您未使用索引。
有关详细信息,请查看here。
答案 1 :(得分:-3)
你可以试试这个:
db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})