1

私の問題を説明させてください。誰かが良いアドバイスをくれることを願っています。

私は現在、大量のアプリケーションの情報とメタデータを保存する Web アプリに取り組んでいます。アプリケーションごとに、アプリケーションとアプリケーションのバージョン ID に関連付けられた 10 ~ 100 のコメントが存在する可能性があります。将来のスケーラビリティとスピードを簡単にする必要があるため、MongoDB を使用しています。読み取りパフォーマンス上の理由からコメントをコレクションに埋め込む必要があることを読みましたが、これが私の場合に機能するかどうかはわかりません。私は別の投稿を読みました:

一般に、特定のデータ セットを単独で操作する必要がある場合は、それをコレクションにします。
投稿者: @kb

ただし、私の場合、自分でコレクションに取り組む必要はありません。さらに説明しましょう。アプリのテーブル (フィルター可能) があり、アプリのリストをスクロールまたはフィルター処理すると、エントリが動的に読み込まれます。アプリケーション コレクション内にコメントを埋め込むと、アプリケーション エントリをテーブルに動的にロードするときに、すべてのコメントが送信されます。ただし、ユーザーがコメントを表示するように要求した場合にのみコメントを読み込みたいという点で、「遅延読み込み」を実行したいと考えています (テーブル内のエントリをクリックすることによって)。

例として、私のテーブルは次のようになります

| app name | version | rating | etc. | view comments |
------------------------------------------------------
| app1     | v.1.0   | 4 star | etc. | click me!     |
| app2     | v.2.4.5 | 3 star | etc. | click me!     |
| ...

私の質問は、より効率的なものは何ですか? MongoDB での読み取りは、各アプリケーションですべてのコメントを取得しても問題にならないほど高速ですか? ユーザーがアプリケーションをフィルタリングせずに一番下までスクロールした場合、125k から 250k のエントリ/アプリケーションがロードされる可能性があります。

4

1 に答える 1

2

クエリについてより具体的に考えることをお勧めします。オブジェクトのどの部分を返したいかを指定します。これにより、アプリケーションに関する特定の情報のみを表示することに関心がある場合に、大量の埋め込みコメントを取得するオーバーヘッドを回避できます。

次のようなことができます:db.collection.find({ appName : 'Foo'}, {comments : 0 });を使用してアプリケーション オブジェクトを取得しますが、その中に埋め込まれたオブジェクト (オブジェクトの配列である可能性が高い) をappName Foo具体的に除外します。comments

MongoDB ドキュメントから

フィールドのサブセットの取得 デフォルトでは、検索操作ではドキュメント/オブジェクト全体が返されます。ただし、特定のフィールドのみを返すように要求する場合もあります。_id フィールドは常に自動的に返されることに注意してください。

// select z from things where x=3
db.things.find( { x : 3 }, { z : 1 } );

大きくなることがわかっている特定のフィールドを削除することもできます。

// get all posts about mongodb without comments
db.posts.find( { tags : 'mongodb' }, { comments : 0 } );

編集一度にアプリlimit(n)だけを取得 する機能も覚えておいてください。nたとえばn=50、コメントなしでアプリを取得するには、次のようにします。

db.collection.find({}, {comments : 0 }).limit(50);
于 2010-07-30T16:07:33.370 に答える