sql >> データベース >  >> NoSQL >> MongoDB

MongoDBスキーマのパフォーマンスの最適化

    ここで最初に頭に浮かぶのは、参照を保存すると、サブドキュメントに保存する場合の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 はメモリ内の演算子でもあり、おそらくここではパフォーマンスが低下します。

    そして、それは迅速な理由のある応答です。私の理由について説明できることはまだまだあると思いますが、それで十分でしょう。



    1. フォーム送信後に古い情報を表示するres.redirect?

    2. マルチタイプのユーザー向けのマングースモデル

    3. 配列をフィルタリングして関連コンテンツを入力するマングースクエリ

    4. ドキュメントが存在する場合、MongoDBはTrueを返します