Vemos em um de nossos serviços que certas consultas sempre resultam em um COLLSCAN
, em vez do índice apropriado ser usado. Os dados têm o formato
{_id: DocumentID, "field": {"child": "Cross-App-ID"}}
com um Índice {"field.child":1}
.
Executar a consulta para "field.child", ou seja, db.collection.find({"field.child":"CA-ID"})
funciona como esperado com o índice sendo usado. No entanto, por algum motivo, o aplicativo que acessa o banco de dados cria as consultas como db.collection.find({"field":{"child":"CA-ID"}})
, o que resulta em um COLLSCAN
em vez de um IXSCAN
.
2 perguntas para mim a partir disto:
- Essas consultas não deveriam ser equivalentes e, portanto, tratadas da mesma forma?
- Como posso criar um índice para o segundo caso de uso? Todos os exemplos que encontrei criam o índice como já fizemos.
As consultas retornam os mesmos resultados, mas do ponto de vista da indexação eles são considerados diferentes.
Índice
{ "field.child": 1 }
, trabalha com consultas do tipodb.test.find({"field.child": "ABCD" })
.E o índice
{ field: 1 }
trabalha com o formato de consultadb.test.find({field: { child: "ABCD" }})
.Você pode criar ambos os índices, e eles serão usados com suas respectivas consultas.