MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mangusto:Como preencher a população de 2 níveis de profundidade sem preencher os campos de primeiro nível? em mongodb


Como um ávido fã do mongodb, sugiro que você use um banco de dados relacional para dados altamente relacionais - é para isso que ele foi criado. Você está perdendo todos os benefícios do mongodb quando precisa realizar mais de 3 consultas para obter um único objeto.

Boaaaaaa , eu sei que o comentário vai cair em saco roto. Sua melhor aposta é ser o mais consciente possível sobre o desempenho. O primeiro passo é limitar os campos ao mínimo obrigatório. Isso é apenas uma boa prática, mesmo com consultas básicas e qualquer mecanismo de banco de dados - obtenha apenas os campos necessários (por exemplo, SELECT * FROM ===ruim... apenas pare de fazer isso!). Você também pode tentar fazer consultas enxutas para ajudar a economizar muito trabalho de pós-processamento que o mangusto faz com os dados. Não testei, mas deve funcionar...
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
    name: 'fieldB',
    select: 'fieldC',
    options: { lean: true }
}).exec(function (err, result) {
    // not sure how you are populating "result" in your example, as it should be an array, 
    // but you said your code works... so I'll let you figure out what goes here.
});

Além disso, uma maneira muito "mongo" de fazer o que você deseja é salvar uma referência no SchemaC de volta ao SchemaA. Quando eu digo "mongo" maneira de fazer isso, você tem que romper com seus anos de pensamento sobre consultas de dados relacionais. Faça o que for necessário para realizar menos consultas no banco de dados, mesmo que exija referências bidirecionais e/ou duplicação de dados.

Por exemplo, se eu tivesse um esquema Book e um esquema Author, provavelmente salvaria o nome e o sobrenome do autor na coleção Books, juntamente com uma referência _id ao perfil completo na coleção Authors. Dessa forma, posso carregar meus livros em uma única consulta, ainda exibir o nome do autor e gerar um hiperlink para o perfil do autor:/author/{_id} . Isso é conhecido como "desnormalização de dados" e é conhecido por causar azia nas pessoas. Eu tento usá-lo em dados que não mudam com muita frequência - como os nomes das pessoas. Na ocasião em que um nome muda, é trivial escrever uma função para atualizar todos os nomes em vários lugares.