对嵌入式文档创建索引
您可以对整个嵌入式文档创建索引。但是,只有指定整个嵌入式文档的查询才会使用索引。对文档中的特定字段的查询不使用该索引。
关于此任务
要在嵌入式文档上使用索引,您的查询必须指定整个嵌入式文档。 如果您的模式模型发生更改,并且您在已索引的文档中添加或删除了字段,这可能会导致意外行为。
查询嵌入式文档时,查询中指定字段的顺序很重要。 查询中的嵌入式文档和返回的文档必须完全匹配。 要查看对嵌入式文档的查询示例,请参阅对嵌入式/嵌套文档的查询。
在为嵌入式文档创建索引之前,请考虑是应该为该文档中的特定字段编制索引,还是使用通配符索引来索引该文档的所有子字段。
开始之前
创建一个 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" } } )