2014-02-28 76 views
1

我有很多像sample1,sample2和sample3的查詢。 MongoDB收集中有超過1300萬條記錄。所以這個查詢花了很長時間。有什麼辦法可以加快這個查詢嗎?如何更快地完成mongodb查詢?

我想使用IMongoQuery對象來解決這個問題。有沒有更好的方法?

樣品1:

var collection = new MongoDbRepo().DbCollection<Model>("tblmodel"); 
decimal total1 = collection.FindAll() 
       .SelectMany(x => x.MMB.MVD) 
       .Where(x => x.M01.ToLower() == "try") 
       .Sum(x => x.M06); 

樣品2:

var collection = new MongoDbRepo().DbCollection<Model>("tblmodel"); 
decimal total2 = collection.FindAll().Sum(x => x.MMB.MVO.O01); 

樣品3:

var list1= collection.FindAll() 
        .SelectMany(x => x.MHB.VLH) 
        .Where(x => x.V15 > 1).ToList(); 

var list2= list1.GroupBy(x => new { x.H03, x.H09 }) 
         .Select(lg => 
           new 
           { 
            Prop1= lg.Key.H03, 
            Prop2= lg.Count(), 
            Prop3= lg.Sum(w => w.H09), 
           }); 
+0

你認爲xxxx是你的問題?什麼問題?請你注意解釋一下,因爲「很長一段時間」並不能真正給我們提出這個問題的想法。你甚至可以解釋這些LINQ查詢如何擴展到Mongo shell中的查詢中嗎? –

+0

並通過你的問題排序提議繞過LINQ。這*可能是值得的。 –

+0

'FindAll'很少是你想使用的。閱讀[MongoDB LINQ教程](http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/)以更好地處理如何正確執行此操作。 – JohnnyHK

回答

3

FindAll返回MongoCursor的功能。將LINQ擴展方法添加到FindAll時,所有處理都發生在客戶端上,而不是數據庫服務器上。每份文件都會返回給客戶。理想情況下,您需要通過使用Find傳遞查詢來限制結果。

或者,你可以使用AsQueryable功能以更好地利用LINQ表達式和擴展方法:

var results = collection.AsQueryable().Where(....); 

我不明白你的數據模型,所以我不能提供任何具體建議如何添加一個可以過濾服務器上更多數據的查詢。

FindAll之後,您可以使用SetFields可鏈式方法限制返回的字段,如果您確實需要將每個文檔都返回給客戶端進行處理。

您還可能發現使用MongoDB聚合框架編寫一些查詢可能會產生類似的結果,而不會向客戶端發送任何數據(結果除外)。或者,根據數據的性質,可能還需要Map-Reduce。