私は外国語を学ぶためのクイズエンジンに取り組んでいます。エンジンはユーザーに4つの画像を同時に表示し、音声ファイルを再生します。ユーザーは音声と正しい画像を一致させる必要があります。以下は、MongoDBのドキュメント構造です。各ドキュメントは、画像ファイル参照と、その画像に一致するオーディオファイルへの参照の配列で構成されます。クイズインスタンスを生成するには、4つのドキュメントをランダムに選択し、画像を表示して、4つのドキュメントから1つのオーディオファイルをランダムに再生します。
アプリケーション開発の次のステップは、ユーザーの推測を保存するのに最適なドキュメントスキーマを決定することです。考慮すべき要件がいくつかあります。
これらすべてを背景情報として、推奨されるスキーマは何でしょうか?たとえば、各推測を画像ドキュメントに保存するか、ユーザードキュメント(図には表示されていません)または推測をログに記録するために作成された新しいドキュメントコレクションに保存しますか?生の推測データをログに記録することをお勧めしますか、それとも関連ドキュメント内のカウンターを増分して統計を事前計算しますか?
画像コレクションのスキーマ:
_id "505bcc7a45c978be24000005"
date 2012-09-21 02:10:02 UTC
imageFileName "BD3E134A-C7B3-4405-9004-ED573DF477FE-29879-0000395CF1091601"
random 0.26997075392864645
user "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioFiles
[
0
{
audioFileName "C3669719-9F0A-4EB5-A791-2C00486665ED-30305-000039A3FDA7DCD2"
user "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioLanguage "English"
date 2012-09-22 01:15:04 UTC
}
1
{
audioFileName "C3669719-9F0A-4EB5-A791-2C00486665ED-30305-000039A3FDA7DCD2"
user "2A8761E4-C13A-470E-A759-91432D61B6AF-25982-0000352D853511AF"
audioLanguage "Spanish"
date 2012-09-22 01:17:04 UTC
}
]
各推測を個別のドキュメントとしてユーザー推測コレクションに保存します。各ドキュメントの構造は次のようになります。
Guess
- userId
- selectedImageId
- correctImageId
表示された画像や再生された音声など、対応するクイックに関する詳細情報を保存することもできます。統計を生成するには、このコレクションに対して Map/Reduce を実行する必要があります。たとえば、推測の合計と正しい推測を取得するには、Map/Reduce出力ドキュメントの構造は次のようになります。
UserStats
- userId
- guesses
- correct
Map関数は次のようになります。
function() {
emit(this.userId, { guesses: 1, correct: this.selectedImageId === this.correctImageId ? 1 : 0 });
}
そして還元関数:
function(key, values) {
var result = { userId = key, guesses: 0, correct: 0 };
values.forEach(function(value) {
result.guesses += value.guesses;
result.correct += value.correct;
});
return result;
}
MongoDBでは、ソースコレクションが更新されるときにMap/Reduceが自動的に実行されないため、自分で実装する必要があることに注意してください。