2016-09-07 7 views
0

現在、一部のデータがMongoDbデータベースに格納されているASP.NET MVCアプリケーションで作業しています。ASP.NET MVCのMongoDbインデックス

私のコレクションは、この(C#クラスの例)のように保存されたドキュメントが含まれています

public class MeteredDataReading 
{ 
    [BsonId] 
    public int MyId { get; set; } 
    public string EDIEL { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime StartOccurence { get; set; } 
    public int Version { get; set; } 
    public DateTime Occurence { get; set; } 

    [BsonRepresentation(MongoDB.Bson.BsonType.Double)] 
    public decimal Quantity { get; set; } 
} 

、それがインデックスに来るとき、私は少し迷ってしまいました。私たちが最も使用しているフィールドは次のとおりです。EDIELOccurenceCreatedDateクエリの例(pesudo)は次のようになります。

Get all MeteredDataReadings where EDIEL = 1234 and occurence >= startDate and occurence <= endDate and CreatedDate <= deadlineDate order by occurence descending

だから、私が持っている最初の熟考は、次のとおりです。インデックスを作成する方法。 3つのフィールド(EDIEL、Occurence、CreatedDate)すべてに対して単一フィールドインデックスを作成するだけでいいですか?または複合インデックスを作成するのを見てみる必要がありますか?もしそうなら、どのフィールドをcompountインデックスに含めるべきですか? EDIELとOccurence?

私が少し気をつけているのは、これらのインデックスを作成する場所と時期です。アプリケーションが起動するときにそれらを作成する必要がありますか?Application_Start()?または、それらはmongodbシェルを介して一度作成されるべきですか?

すべてのヘルプ/ヒント/洞察力が大幅にあなたのケースでは

答えて

0

:-)高く評価され、あなたは、化合物のインデックスを設定する必要があります。


db.MeteredDataReading.createIndex({ "EDIEL": 1, "occurence": 1, "CreatedDate":1 })

MongoDBのインデックスは、データベースの設計とアプリケーションのパフォーマンスの非常に重要な側面です。

クエリーがexplain()を使用して列の読み取りを行っているかどうかを確認することもできます。彼らがインデックスを作成し、確実に確認する必要がある列スキャンを実行している場合、クエリがインデックスに当たっていて、ディスクの読み取りが回避されます。

`db.MeteredDataReading.find({$query: 
    { "EDIEL": 1234, 
    {"occurence" :$gte: ISODate("2010-04-29T00:00:00.000Z"), 
        $lte: ISODate("2010-05-01T00:00:00.000Z")}, 
    "CreatedDate":$lte: ISODate("2010-05-01T00:00:00.000Z")}, 
    $orderby: { occurence : -1 } }).explain("executionStats")` 
+0

こんにちはMortensen、上記のクエリはあなたを助けました。 –

関連する問題