Първото нещо, което идва на ум тук е:защо съхраняването на справка ви струва 5000 пъти повече от това, което струва съхраняването в поддокумент?
Добре, като гледам вашата схема, смятам, че най-добрият метод е отделно събиране на думи, а не на пакети.
Първият червен флаг, който видях, е вашето двойно влагане тук:
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
с поддокумент ще бъде много трудно да се работи в текущата версия на MongoDB, обикновено 2-3 нива дълбоко започва да има проблеми, особено с позиционните оператори.
Като се има предвид, че винаги трябва да работите от най-високата възможна стойност, която можете да получите тук:
Трябва също така да разгледате разходите за жилище в този документ. Операторите, от които се нуждаете, ще бъдат в паметта като $pull
, $push
, $addToSet
и т.н., което означава, че целият ви документ ще трябва да бъде сериализиран и зареден в собствените C++ структури на MongoDB. Това ще бъде изключително трудоемка задача в зависимост от трафика към тези документи.
Имайки предвид вашия коментар:
то просто забива още един пирон в ковчега на вграждането на думите в основния потребителски документ. Имайки предвид това, което казах в предишния параграф, това няма да работи добре с разходите за използване на оператори в паметта на words
масив.
Това ще работи много по-добре, ако думите са разделени, $slice
също е оператор в паметта и вероятно ще претърпи намалена производителност тук.
И това е бърз аргументиран отговор. Сигурен съм, че има още какво да обясня за причината си, но това трябва да е достатъчно.