143

メインスキーマでサブドキュメントを使用することと、より深いレイヤーを使用することの長所と短所について興味があります。

var subDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [subDoc]
});

また

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});

現在、どこでもサブドキュメントを使用していますが、主に発生する可能性のあるパフォーマンスまたはクエリの問題について疑問に思っています。

4

6 に答える 6

84

docsによると、まったく同じです。ただし、スキーマを使用すると、_idフィールドも追加され (無効にしない限り)、おそらくサブドキュメントを追跡するためにさらにリソースが使用されます。

代替宣言構文

v3 の新機能 サブドキュメント スキーマ インスタンスにアクセスする必要がない場合は、オブジェクト リテラルを渡すだけでサブドキュメントを宣言することもできます [...]

于 2013-05-11T04:53:45.870 に答える
43

モデルのさまざまな部分で再利用されるスキーマがある場合、自分で複製する必要がないように、子ドキュメントに個別のスキーマを定義すると便利な場合があります。

于 2013-09-20T18:20:03.617 に答える
29

埋め込みドキュメントが静的ドキュメントである場合、またはパフォーマンスへの影響のために数百を超えない場合は、埋め込みドキュメントを使用する必要があります。私はしばらく前にその問題について経験しました。新しく、MongoDB のソリューション アーキテクトとして働く Asya Kamsky が、「サブドキュメントの使用」に関する記事を書きました。

解決策やベストプラクティスを探している人に役立つことを願っています.

http://askasya.com/post/largeembeddedarraysの元の投稿。https://stackoverflow.com/users/431012/asya-kamskyで彼女の stackoverflow プロフィールにアクセスできます

まず、なぜそのようなことをしたいのかを考えなければなりません。通常、このドキュメントを取得するときに常に取得したいものを埋め込むことをお勧めします。これの裏返しとして、元に戻したくないものをドキュメントに埋め込みたくないということです。

私が実行したアクティビティをドキュメントに埋め込むと、最初はうまく機能します。私のアクティビティはすべてそこにあり、1 回の読み取りで、表示したいすべてのものを取得できるからです。「あなたは最近これとここをクリックしました。あなたの最後の2つのコメントは何ですか?」しかし、6か月が経過するとどうなりますか?

まず、ますます大きなドキュメントを返し、その小さな部分に注意を払うことになります。しかし、プロジェクションを使用して配列の一部のみを返すことができます。本当の問題は、ディスク上のドキュメントが大きくなり、その一部のみをエンド ユーザーに返す場合でも、すべてが読み取られることです。私の活動は私が活動している限り止まらないので、ドキュメントはどんどん成長し続けます。

これに関する最も明白な問題は、最終的に 16MB のドキュメント制限に達することですが、それはまったく気にする必要はありません。継続的に増大するドキュメントは、ディスク上で再配置する必要があるたびにますますコストが高くなり、断片化の影響を軽減するための措置を講じたとしても、書き込みは全体的に不必要に長くなり、アプリケーション全体の全体的なパフォーマンスに影響を与えます.

アプリケーションのパフォーマンスを完全に低下させるためにできることがもう 1 つあります。それは、この増え続ける配列にインデックスを付けることです。つまり、この配列を持つドキュメントが再配置されるたびに、更新する必要があるインデックス エントリの数は、そのドキュメント内のインデックス付きの値の数に正比例し、配列が大きいほど、その数も大きくなります。なれ。

配列がデータ モデルに適している場合に配列を使用することを怖がらせたくありません。配列はドキュメント データベース データ モデルの強力な機能ですが、すべての強力なツールと同様に、適切な状況で使用する必要があります。注意して使用する必要があります。

于 2015-01-09T05:52:29.090 に答える
19

基本的に、変数nestedDovを作成してここに配置しますname: [nestedDov]

シンプルバージョン:

var nestedDoc = new Schema({
  name: String
});

var mainDoc = new Schema({
  names: [nestedDoc]
});

JSON の例

{
    "_id" : ObjectId("57c88bf5818e70007dc72e85"),
    "name" : "Corinthia Hotel Budapest",
    "stars" : 5,
    "description" : "The 5-star Corinthia Hotel Budapest on the Grand Boulevard offers free access to its Royal Spa",
    "photos" : [
        "/photos/hotel/corinthiahotelbudapest/1.jpg",
        "/photos/hotel/corinthiahotelbudapest/2.jpg"
    ],
    "currency" : "HUF",
    "rooms" : [
        {
            "type" : "Superior Double or Twin Room",
            "number" : 20,
            "description" : "These are some great rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/2.jpg",
                "/photos/room/corinthiahotelbudapest/5.jpg"
            ],
            "price" : 73000
        },
        {
            "type" : "Deluxe Double Room",
            "number" : 50,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 92000
        },
        {
            "type" : "Executive Double Room",
            "number" : 25,
            "description" : "These are amazing rooms",
            "photos" : [
                "/photos/room/corinthiahotelbudapest/4.jpg",
                "/photos/room/corinthiahotelbudapest/6.jpg"
            ],
            "price" : 112000
        }
    ],
    "reviews" : [
        {
            "name" : "Tamas",
            "id" : "/user/tamas.json",
            "review" : "Great hotel",
            "rating" : 4
        }
    ],
    "services" : [
        "Room service",
        "Airport shuttle (surcharge)",
        "24-hour front desk",
        "Currency exchange",
        "Tour desk"
    ]
}

例:

ここに画像の説明を入力

于 2016-09-02T15:16:33.813 に答える
9

これは、SOの複数の投稿によって他の場所で処理されると思います。

少しだけ:

ここで重要な点は、ここには単一の答えはなく、一連のかなり複雑なトレードオフがあるだけだということです。

于 2013-03-04T22:11:06.363 に答える