sql >> Databáze >  >> NoSQL >> MongoDB

Mongoose:Jak zalidnit populaci 2 úrovní, aniž byste zaplnili pole první úrovně? v mongodb

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.



  1. Spring Data MongoDB a allowDiskUse

  2. Mongodb:kdy volat secureIndex?

  3. Meteor:publikujte 2 různé projekce prvků pole

  4. Elastické vyhledávání S MongoDB:Prohledávání PDF