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

Optimalizace výkonu schématu MongoDB

První věc, která vás zde napadne, je:proč vás uložení reference stojí 5000krát více, než kolik stojí uložení v dílčím dokumentu?

Dobře, když se podívám na vaše schéma, věřím, že nejlepší metodou je oddělený sběr slov, nikoli balíků.

První červená vlajka, kterou jsem viděl, je vaše dvojité hnízdění zde:

packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]

words s vnořeným dokumentem bude v aktuální verzi MongoDB velmi těžké pracovat, obvykle 2-3 úrovně hluboko začnou mít problémy, zejména s pozičními operátory.

Nyní uvážíme, že byste měli vždy pracovat od nejvyšší možné hodnoty, kterou zde můžete získat:

Tento dokument musíte také zvážit náklady na bydlení. Operátory, které potřebujete, budou operátory uložené v paměti, například $pull , $push , $addToSet atd, což znamená, že celý váš dokument bude muset být serializován a načten do nativních struktur C++ MongoDB. To bude extrémně náročný úkol v závislosti na provozu těchto dokumentů.

S ohledem na váš komentář:

pouze vkládá další hřebík do rakve vkládání slov do hlavního uživatelského dokumentu. Vzhledem k tomu, co jsem řekl v předchozím odstavci, to nebude dobře fungovat s náklady na použití operátorů v paměti u words pole.

To bude fungovat mnohem lépe, pokud budou slova rozdělena, $slice je také operátor v paměti a pravděpodobně by zde utrpěl snížený výkon.

A to je rychlá odůvodněná odpověď. Jsem si jistý, že o svém důvodu bych mohl vysvětlit více, ale to by mělo stačit.



  1. Aktualizace vnořeného pole uvnitř pole mongodb

  2. MongoDB, Java:Načtení vlastnosti data jako UTC

  3. Výmluvný Outside of Laravel s několika DB připojeními jenssegers/laravel-mongodb

  4. Jak nasadit kontejner dockeru ve Windows