2012-02-23 5 views
0

を検索:ビジターと私はそれが次のようになりますが、その中に訪問の配列を埋め込むしたいと思います:MongoDBの埋め込み構造と私はコレクションを持っている場合は

 
Visitor1 
->Visit 1 
->Visit 2 

Visitor2 
->Visit 1 
->Visit 2 
  • は、これは良い構造です?
  • 私は何百万ものドキュメントを持っていますが、最初に訪問者を探して訪問する必要があります。この構造は効率的ですか?
  • すべての訪問者にすべての訪問を表示するにはどうすればよいですか?

答えて

2

もっと頻繁に何をしなければならないかによって効率化することができます。その中の構造自体は問題ありません。訪問者を照会したときに、1人の訪問者が「無料」ですべての訪問を取得することが最大の利点であるため、単一の訪問者のすべての訪問を簡単に行うことができます。また、スキーマをクリーンアップする訪問コレクションが不要であることを意味します。訪問を削除

db.visitors.update({_id:<visitorId>}, {$push:{visits:<newVisit>}})

:訪問を追加

:ここ

はあなたが必要な操作への実装例です

db.visitors.update({_id:<visitorId>}, {$pull:{visits:{visitId:<visitId>}})

すべての訪問者のすべての訪問を表示することを意味していた場合は、現在そのように直接行う方法はありません。個々の配列をアンラップしたり、m/rを使用するには、別個の操作とアプリケーションロジックのどちらかを使用します。 2.2で。それをうまくやることができる集約フレームワークがあります。

は、いくつかのものはしかし考慮することがあります。

  • 文書は、16メガバイトの制限があります。この制限に達するのに十分な訪問数があれば、個別の訪問収集が必要です。
  • 特定の訪問者を訪問することはできません。あなたは常にトップレベルの文書を照会します。そのため、ユーザーが14,000回の訪問をしており、特定の数だけ必要な場合は、文書全体を取得する必要があります。ページングのためには、$ sliceを使ってこれを処理することができます。
  • 1人の訪問者に対して1回の更新で複数の訪問を変更することは、個別の訪問コレクションがないと難しいことがあります。位置演算子$を使用して、更新ごとに1つの配列要素のみをアドレス指定できます。

希望するものがあります。

関連する問題