你可以做任何一个:
> 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 个索引是相同的。
但是,正如子文档示例所示,如果您只是索引整个子文档而不是特定字段,然后执行比较运算符(例如 @ 987654325@) - 如果你索引一个特定的子字段,你会得到一个不太灵活但可能更有用的索引。
这完全取决于您的用例。
无论如何,一旦您创建了索引,您就可以检查创建的内容:
> 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",那么你的索引没有被使用。
更多详细信息请查看here。