2012-12-20 52 views
1

我正在開發一個asp.net Web應用程序,該應用程序應該爲用戶提供數千張JPEG圖像。我的專用服務器包含JPEG文件並承載一個用於存儲JPEG元數據的MongoDB。MongoDB C#驅動程序通過使用AJAX光標迭代地檢索5000個文檔

Sample object in a collection named **JPEG_123** (this collection has 1 million such documents and each document has _id indexed) 
{ 
    "_id" : "20121210185015000", //YYYYMMDDhhmmsslll 
    "Url" : "http:...", 
    "CameraId" : 123 
} 

我正在使用Web方法來查詢MongoDB。我查詢收集JPEG_123正則表達式的Utc字段(例如「^ 2012121018 * /)」以獲取單個小時的文檔。它返回大約5000個由MongoCursor指向的記錄,並且在MongoShell上它只顯示3-4毫秒的時間此數據。

問:我怎麼能在ASP.NET通過MongoCursor獲得這些文件反覆從MongoDB的最好的和快速的方法是什麼?有了這樣MongoCursor屬性的最佳使用極限,BATCHSIZE和NEXT的。

我正在嘗試做這樣的事情:

  • 執行上述從ASP.NET
  • 查找查詢有關MongoDB
  • 只取前500頁的文件在網絡上開始並保持休息4500在RAM
  • 取其餘4500個文檔在MongoCursor在9次後續的迭代(每次獲得500)
  • 或任何其他可能性,以加快通過網絡發送這些數據

我的關注

    的過程
  1. 當我從ASP.NET中查詢MongnoDB時,是否真的意味着MongoDB將所有5000條記錄加載到RAM,但不會將所有5000條記錄返回給ASP.NET?

  2. 發出上述查詢後,它立即返回MongoCursor指向的記錄總數。當我循環遍歷MongoCursor中的所有文檔時,大約需要20-30秒。這是否意味着,MongoDB在應用程序中使用它時會返回數據?

回答

0

我發現使用大集合尺寸的遊標運行速度非常慢,除非集合索引得非常好。你應該注意到,在大多數情況下,正則表達式排除了索引的使用,你應該儘可能地避免使用這些索引。

默認情況下,遊標每批次返回101個文檔或1 MB數據。如果您可以通過查看收集統計信息來確定平均文檔的大小,則可以利用它來設置最佳限制。在光標對象中還可以使用一些設置來幫助擴展這些限制。

我可能會提出一個建議,因爲與讀取相比,寫入速度已經很慢,因此需要將這些UTC字符串作爲日期字段傳遞,並讓Mongo爲您解析這些字符串。這樣你就可以爲字段建立索引並在查詢中使用正常的日期範圍比較。

相關問題