たくさんの記事があり、人々が好きな記事に投票できるWebサイトがあるとします。
特定の時間(過去1時間、最終日、先週)内に投票数が最も多い記事を、投票数順にクエリして取得できるようにしたいと思います。
MongoDBでいつものように、これを実装する方法はいくつかありますが、どれが正しいかわかりません。
- 投票の配列を含む投稿ドキュメント-投票自体は、ユーザーID、ユーザー名、投票日を含むドキュメントです。
{
"_id": "ObjectId(xxxx)",
"title": "Post Title",
"postdate": "21/02/2012+1345",
"summary": "Summary of Article",
"Votes": [
{
"userid":ObjectId(xxxx),
"username": "Joe Smith",
"votedate": "03/03/2012+1436"
},
]
}
- 個々の投票の詳細と投票された投稿への参照を含む、個別の投票コレクション:
{
"_id": "ObjectId(xxxx)",
"postId": ObjectId(xxxx),
"userId": ObjectId(xxxx),
"votedate": "03/03/2012+1436"
}
最初のものはもっとDocumenteyですが、過去24時間で最も多くの票を獲得したドキュメントを取得するためにvotes配列をクエリする方法がわかりません。
投票ごとにグループ化された投票数を照会する方が簡単なので、2番目のものに傾いていますが、それがどれほどうまく機能するかはわかりません。これはリレーショナルデータベースで行う方法ですが、あまり文書化されていないようですが、問題があるかどうかはわかりませんね。
または、2つの組み合わせを使用しますか?また、ページが読み込まれるたびに、このタイプの集計クエリをリアルタイムで実行します。または、クエリを1分に1回実行して、結果をクエリ結果コレクションに保存しますか?
このスキーマをどのように実装しますか?