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.