2016-03-30 19 views
1

クエリから取得した単一のドキュメントごとにデータベースに要求するのではなく、 WriteModel操作のリストを代わりに作成することができます。MongoでWriteModelのリストを効率的に作成するには?

var operationList = new List<WriteModel<JobInfoRecord>>(); 

using (var cursor = await jobInfoDocuments.Find(filter).Project(projectionDefinition).ToCursorAsync()) 
{ 
     while (await cursor.MoveNextAsync()) 
     { 
      var batch = cursor.Current; 
      foreach (var document in batch) 
      { 
       var newInfo = Regex.Replace(document.SerializedInfo, regex, EmptyTag); 

       // Applying several operations within the one request. 
       operationList.Add(new UpdateOneModel<JobInfoRecord>(Builders<JobInfoRecord>.Filter.Eq("_id", document.Id), 
                    Builders<JobInfoRecord>.Update.Set("SerializedBackgroundJobInfo", newInfo))); 
      } 

1000とクリアリストごとに1回実行するのは良いアルゴリズムですか?

if (operationList.Count <= 1000) 
{ 
    await jobInfoDocuments.BulkWriteAsync(operationList, writeOptions); 
    operationList = new List<WriteModel<JobInfoRecord>>(); 
} 

そしてwhile (await cursor.MoveNextAsync())確認後、私たちは何も

if (operationList.Count > 0) 
{ 
    await jobInfoDocuments.BulkWriteAsync(operationList, writeOptions); 
} 

を忘れていなかった場合、または私はただのif声明なしforeachループの後に次の操作を実行できます。

await jobInfoDocuments.BulkWriteAsync(operationList, writeOptions); 
operationList = new List<WriteModel<JobInfoRecord>>(); 

どうすべき私はforeachループの後に行うのですか?

答えて

2

あなたは、これはパフォーマンスを向上するための最良の方法ですforeach

// Execute once in every 1000 and clear list 
if (operationList.Count == 1000) 
{ 
    await jobInfoDocuments.BulkWriteAsync(operationList, writeOptions); 
    operationList = new List<WriteModel<JobInfoRecord>>(); 
} 

内のコードのこのblookを移動する必要があります。

各操作グループには、最大1000個の操作を含めることができます。グループがこの制限を超えると、MongoDBはグループを1000以下の小さなグループに分割します。たとえば、一括操作リストが2000個の挿入操作で構成される場合、MongoDBは2つのグループを作成し、それぞれ1000個の操作を行います。

関連する問題