我们在某项服务中看到,某些查询总是导致出现COLLSCAN
,而不是使用适当的索引。数据的形式为
{_id: DocumentID, "field": {"child": "Cross-App-ID"}}
带有索引{"field.child":1}
。
运行“field.child”查询,db.collection.find({"field.child":"CA-ID"})
即使用索引时,工作正常。但是,出于某种原因,访问数据库的应用程序将查询创建为db.collection.find({"field":{"child":"CA-ID"}})
,结果为COLLSCAN
而不是IXSCAN
。
对此我有两个疑问:
- 这些查询难道不应该是等效的并且被同等对待吗?
- 如何为第二个用例创建索引?我发现的所有示例都像我们已经做的那样创建了索引。
查询返回相同的结果,但是从索引点来看,它们被认为是不同的。
索引
{ "field.child": 1 }
,用于形状的查询db.test.find({"field.child": "ABCD" })
。并且,索引
{ field: 1 }
与查询形状一起工作db.test.find({field: { child: "ABCD" }})
。您可以创建两个索引,并且它们将与各自的查询一起使用。