2016-03-18 61 views
0

在CreateDocumentQuery中,我使用MaxItemCount,然後使用HasMoreResults和ExecuteNextAsync - 這在其他文章中已有描述。Azure DocumentDB使用MaxItemCount跳過記錄的C#SDK

我的問題是,有時 - 特別是在對DocumentDB進行大量更新之後 - 循環遍歷每個文檔都有一些隨機結果,其中多達一半的文檔被忽略。

這隻會發生,如果我在查詢設置中包含SQL查詢 - 因爲我只需要處理一些字段/列。如果我允許所有的領域回來,它的工作100%。但是這樣做效率不高,因爲我僅輸出幾列,而且有近百萬條記錄。

我需要使用C#,因爲它是一個與其他C#模塊鏈接的計劃作業。

有沒有人能夠一致地循環使用分頁的大集合?

下面的代碼提取 - 包括sql - 如果我從查詢中刪除sql沒有問題。

sql = "select d.field1, d.field2 from doc d"; 
var query = client.CreateDocumentQuery("dbs/" + database.Id + "/colls/" + documentCollection.Id, sql 
      new FeedOptions { MaxItemCount = 1000 } 
      ).AsDocumentQuery(); 

while (query.HasMoreResults) 
{ 
    FeedResponse<Document> res; 
    while (true) 
    { 
     try 
     { 
      res = await query.ExecuteNextAsync<Document>(); 
      break; // success! 
     } 
     catch (Exception ex) 
     { 
      if (ex.Message.IndexOf("request rate too large") > -1) 
      { 
       // DocumentDB is under pressure - wait a while and retry - this will resolve eventually 
       System.Threading.Thread.Sleep(5000); 
      } 
      else 
      { 
       errorcount++; 
       throw ex; 
      } 
     } 
    } 
    if (res.Any()) 
    { 
     foreach (var liCurrent in res) 
     { 
      try 
      { 
       // Convert the Document to a CSV line item 
       // DO THE FILE LINE CREATION HERE 
       fileLineItem = "test"; 

       // Write the line to the file 
       writer.WriteLine(fileLineItem); 
      } 
      catch (Exception ex) 
      { 
       errorcount++; 
       throw ex; 
      } 
      totalrecords++; 
     } 
    } 
} 
+0

什麼是數據庫的一致性級別?有關一致性級別的更多信息,請查看https://azure.microsoft.com/en-us/documentation/articles/documentdb-consistency-levels/ –

+0

謝謝 - 將一致性更改爲一致而非懶惰似乎解決了這一問題。 – smulldino

+1

您應該將其作爲答案發布。可能對其他人有用。 –

回答

0

Amab指出的解決方案是將一致性級別設置爲一致。我以前做過這件事 - 但自那時起我刪除並重新創建了這個集合。創建集合時,默認設置爲懶惰。所以你需要在創建時指定它,或者稍後修改它。

Thanks Amab