MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mangusta:come popolare una popolazione profonda di 2 livelli senza popolare i campi di primo livello? in mongodb

In quanto fan accanito di mongodb, ti suggerisco di utilizzare un database relazionale per dati altamente relazionali:ecco per cosa è stato creato. Stai perdendo tutti i vantaggi di mongodb quando devi eseguire più di 3 query per ottenere un singolo oggetto.

Buongiorno , so che quel commento cadrà nel vuoto. La soluzione migliore è essere il più consapevole possibile delle prestazioni. Il primo passo è limitare i campi al minimo richiesto. Questa è solo una buona pratica anche con query di base e qualsiasi motore di database - ottieni solo i campi che ti servono (es. SELECT * FROM ===pessimo... smettila di farlo!). Puoi anche provare a eseguire query snelle per risparmiare molto del lavoro di post-elaborazione che Mongoose fa con i dati. Non l'ho testato, ma dovrebbe funzionare...

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.
});

Inoltre, un modo molto "mongo" per fare ciò che vuoi è salvare un riferimento in SchemaC su SchemaA. Quando dico modo "mongo" di farlo, devi rompere i tuoi anni di pensiero sulle query di dati relazionali. Fai tutto il necessario per eseguire meno query sul database, anche se richiede riferimenti bidirezionali e/o duplicazione dei dati.

Ad esempio, se avessi uno schema Libro e uno schema Autore, probabilmente salverei il nome e il cognome degli autori nella raccolta Libri, insieme a un riferimento _id al profilo completo nella raccolta Autori. In questo modo posso caricare i miei libri in un'unica query, visualizzare ancora il nome dell'autore e quindi generare un collegamento ipertestuale al profilo dell'autore:/author/{_id} . Questo è noto come "denormalizzazione dei dati" ed è noto per causare bruciore di stomaco alle persone. Cerco di usarlo su dati che non cambiano molto spesso, come i nomi delle persone. Nell'occasione in cui un nome cambia, è banale scrivere una funzione per aggiornare tutti i nomi in più punti.