Jako zanícený fanoušek mongodb vám doporučuji používat relační databázi pro vysoce relační data – na to je vytvořena. Ztrácíte všechny výhody mongodb, když musíte provést 3+ dotazy, abyste získali jediný objekt.
Buuuuuut , Vím, že ten komentář bude hluchý. Nejlepším řešením je být co nejvíce vědomý ohledně výkonu. Vaším prvním krokem je omezit pole na požadované minimum. To je jen dobrá praxe i se základními dotazy a jakýmikoli databázový stroj – získejte pouze pole, která potřebujete (např. SELECT * FROM
===špatné... prostě to přestaň dělat!). Můžete také zkusit provádět štíhlé dotazy, které vám pomohou ušetřit spoustu práce po zpracování, kterou mongoose s daty vykonává. Netestoval jsem to, ale mělo by to fungovat...
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.
});
Také velmi „mongo“ způsob, jak dělat to, co chcete, je uložit odkaz ve SchemaC zpět do SchemaA. Když řeknu „mongo“ způsob, jak to udělat, musíte se odpoutat od let přemýšlení o dotazech na relační data. Udělejte vše, co je potřeba, abyste provedli méně dotazů na databázi, i když to vyžaduje obousměrné odkazy a/nebo duplikaci dat.
Pokud bych například měl schéma Kniha a schéma Autor, pravděpodobně bych uložil jméno a příjmení autorů do sbírky Knihy spolu s odkazem _id na úplný profil ve sbírce Autoři. Tímto způsobem mohu načíst své knihy v jediném dotazu, stále zobrazovat jméno autora a poté vygenerovat hypertextový odkaz na profil autora:/author/{_id}
. Toto je známé jako „denormalizace dat“ a je známo, že způsobuje pálení žáhy. Snažím se to používat na datech, která se příliš často nemění – jako jsou jména lidí. V případě, že se jméno změní, je triviální napsat funkci, která aktualizuje všechna jména na více místech.