在嵌入式文档上创建索引
您可以为嵌入式文档创建索引。但是,只有指定整个嵌入式文档的查询才使用索引。对文档中特定字段的查询不使用索引。
关于此任务
要使用嵌入文档的索引,您的查询必须指定整个嵌入文档。如果您的模式模型发生变化,您在索引文档中添加或删除字段,这可能会导致意外的行为。
当您查询嵌入文档时,查询中指定字段的顺序很重要。您查询的嵌入文档和返回的文档必须完全匹配。要查看嵌入文档查询的示例,请参阅嵌入/嵌套文档的查询.
在您对嵌入文档创建索引之前,考虑是否应该在该文档中索引特定字段,或者使用通配符索引来索引文档的所有子字段。
在开始之前
创建一个students 集合,包含以下文档
db.students.insertMany( [ { "name": "Alice", "gpa": 3.6, "location": { city: "Sacramento", state: "California" } }, { "name": "Bob", "gpa": 3.2, "location": { city: "Albany", state: "New York" } } ] )
步骤
在 location 字段上创建索引
db.students.createIndex( { location: 1 } )
结果
以下查询使用了 location 字段的索引
db.students.find( { location: { city: "Sacramento", state: "California" } } )
以下查询 没有 使用 location 字段的索引,因为它们在嵌入文档的特定字段上进行了查询
db.students.find( { "location.city": "Sacramento" } ) db.students.find( { "location.state": "New York" } )
为了使点符号查询能够使用索引,您必须在您正在查询的特定嵌入字段上创建索引,而不是整个嵌入对象。例如,请参阅 点符号查询,以及 在嵌入字段上创建索引。
以下查询没有返回结果,因为查询谓词中的嵌入字段指定的顺序与文档中出现的顺序不同
db.students.find( { location: { state: "California", city: "Sacramento" } } )