ここで最初に頭に浮かぶのは、参照を保存すると、サブドキュメントに保存する場合の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
など。つまり、ドキュメント全体をシリアル化して、MongoDBのネイティブC++構造体にロードする必要があります。これらのドキュメントへのトラフィックによっては、これは非常に時間のかかる作業になります。
コメントを検討する:
メインのユーザードキュメント内に単語を埋め込むという棺桶に別の釘を置くだけです。前の段落で私が言ったことを考えると、これはwords
でメモリ内演算子を使用するコストではうまく機能しません。 配列。
単語が分割されている場合、これははるかにうまく機能します、$slice
はメモリ内の演算子でもあり、おそらくここではパフォーマンスが低下します。
そして、それは迅速な理由のある応答です。私の理由について説明できることはまだまだあると思いますが、それで十分でしょう。