Há muitas coisas a fazer para otimizar sua consulta. O que eu tentaria:
-
Como Anthony Winzlet disse nos comentários, use o estágio $match possível como primeiro estágio. Dessa forma, você pode reduzir o número de documentos passados para as etapas seguintes e usar índices.
-
Supondo que você use pelo menos a versão 3.6 do mongo, altere seus estágios de pesquisa usando a sintaxe 'let/pipeline' (veja aqui ). Dessa forma, você pode integrar seus 'filtros externos' ( "customer_info.status":{$ne:9}, "model_info.status":{$ne:9} ) em um estágio $match em seu pipeline de pesquisas. Com índices nos campos/coleções corretos, você ganhará algum tempo/memória em seus estágios de $lookup.
-
Faça suas etapas de desenrolamento o mais tarde possível, para restringir o número de documentos passados para as etapas seguintes.
É importante entender como funciona o pipeline de agregação:cada estágio recebe dados, faz suas coisas e passa os dados para o próximo estágio. Portanto, quanto menos dados forem passados para o pipeline, mais rápida será sua consulta.