1

私はこの問題を解決しています:

ユーザーが画像をアップロードできるIMGURクローンを構築しています。最新のアップロード画像1000枚を表示する「最新のアップロード」ページがあります。

  • ユーザーはサインアップするとすぐに写真をアップロードできますが
  • ユーザーがメールアドレスを確認するまで、アップロードは「最新のアップロード」に表示されません
  • ユーザーがメールを確認するとすぐに、画像が表示され始めます。
  • ユーザーが禁止されている場合、その画像は「最新のアップロード」に表示されません

元々、イメージにユーザー ref が含まれていたので、ユーザーに取り込まれた最後の 1000 個のイメージを選択しました。次に、返されたコレクションを反復処理して、禁止されたユーザーまたは検証されていないユーザーが所有する画像を破棄します。これは、最後の 1000 枚の画像が未確認のユーザーによってアップロードされたときに壊れます。

User オブジェクトで内部の Image ドキュメントの配列を使用することを検討していますが、それは理想的ではありません。なぜなら、User は多数の Image を所有している可能性があり、User オブジェクトをロードするときにそれらを常にロードしたいわけではないからです。

私はどんな解決策にもオープンです

4

1 に答える 1

1

あなたのアプリケーションについて私が持っている知識に基づいて、次のことを行います。

ユーザーとアップロードの 2 つの異なるコレクションに存在する必要がある 2 つのエンティティがあります。

アップロード コレクションは非常に大きくなるため、クエリに必要なスケールとパフォーマンスを処理するために、コレクションをインデックス化およびシャード化できるようにしたいと考えています。そうは言っても、アップロードの重要な要素は次のとおりです。

uploads=
{
_id:uploadId
user:{id:userId, emailverified:true, banned:false}
ts:uploadTime
.
.
.
}

可能なインデックス:

i. {ts:1,banned:1,"user.emailverified":1,"user.banned":1} (this index should be multi-purpose)
ii. {"user.id":1,ts:1}

最新の 1000 クエリを最適化するために、いくつかの冗長データを保存していることに注意してください。コストは、emailverified およびban を更新する必要があるまれなケースでは、ユーザー コレクションとアップロード コレクションで更新を実行する必要があることです (これには multi:true が必要です)。

クエリ:

db.uploads.find({ts:{$gt:sometime},banned:false,emailverified:true}.sort({ts:-1}).limit(1000)
于 2013-07-24T04:51:42.363 に答える