0

ストリーミング API からデータを収集しており、リアルタイム分析ダッシュボードを作成したいと考えています。ストリームの最後に新しいレコードが表示されるたびに、以下のドキュメントのカウンターを更新します。

デザインの観点から。以下の例のように、1 つのドキュメントのみを使用するのは正しいですか?

{
    "_id" : ObjectId("5238beb4d4bed9e444c99978"),
    "counts" : {
        "hours" : {
            "1" : 835,
            "2" : 1007,
            .
                    .
                    .
                    "3" : 174,
         }
}

このアプローチの利点は、1 つのドキュメントのみをリアルタイム分析ダッシュボードに送信する必要があることです。また、1 年後、このドキュメントには 365 * 24 フィールドしかなく、その年の 1 時間ごとに 1 つですか?

索引付けはどうですか?ドキュメントが 1 つしかない場合、counts.hours にインデックスを作成できますか? それとも、インデックスは mongodb のコレクション全体でのみ機能しますか? インデックスは、ドキュメントやドキュメント内のフィールドをより速く見つけるのに役立ちますか?

counts.hours にインデックスを作成できれば、カウンターのインクリメント プロセスは、(ストリームの最後の新しいドキュメントごとに) インクリメントする正しい時間をはるかに効率的に見つけることができます。

4

1 に答える 1

0

ドキュメントに埋め込まれたフィールドにインデックスを作成できます。上記の場合:

yourCollection.ensureIndex({ 'counts.hours':1 });

インデックスは、「counts.hours」フィールドに基づいてドキュメントを返すクエリを最適化するのに役立ちます。

youCollection.find({ 'count.hours':1 });

データ構造の設計は、実行する予定のクエリと更新の種類によって異なります。あなたが説明した場合、「時間」オブジェクトにメンバーを追加することになると思います.MongoDBは各コレクションレコードをパディングして、更新全体でレコードサイズが安定している場合に最適化するため、そのような更新は高価になる可能性があります.

于 2013-09-18T06:01:05.407 に答える