2016-10-18 35 views
1

我正在使用一些簡單的表格小部件(前端)來呈現數據和分頁。 因此,在過濾來自mongo數據庫的數據之後,我需要在跳過和限制之前對它們進行計數。我的方式接近效率嗎?分頁和統計文檔的高效方法

var count = _database.GetCollection<BsonDocument>("alarms").Find(filter).Count(); 
var result = _database.GetCollection<BsonDocument>("alarms").Find(filter).Sort(sort).Limit(limit).Skip(limit * (page - 1)).ToListAsync(); 
var data = new BsonArray(result.Result); 
return new BsonDocument { { "data", data }, { "count", count } }; 

回答

0

對於運行總計,而不是執行數查詢的,你能不能只是假設你的頁面和極限參數計數?

所以......

var skip = limit * (page - 1); 

var result = _database.GetCollection<BsonDocument>("alarms") 
    .Find(filter) 
    .Sort(sort) 
    .Skip(skip) 
    .Limit(limit) 
    .ToListAsync(); 

var data = new BsonArray(result.Result); 
var count = (limit * (page - 1)) + result.Count(); 

return new BsonDocument { { "data", data }, { "count", count} }; 

保存正在爲計數額外的呼叫。

但是,要檢索過濾器的所有匹配文檔的計數,您需要按照您的要求執行額外的計數,該計數提供了對數據的所有必要索引,對於您想要的並不是非常低效實現,看到計數只返回一個整數,並沒有收集實際的數據。

側面說明,你會想之前跳過()你限制()

+0

我需要整個保藏中心統計,所以我可以作出這樣的按鈕「跳轉到第10頁」等你的方法,當我第1頁過濾後取10條記錄產生count = 10 * 0 + 10 = 10而不是27k條記錄。 – lukpep

+0

事實上,如果您希望集合中的全部記錄爲每個可跳轉到的頁面提供鏈接,則需要單獨檢索它們。道歉我誤解了,我給你的代碼是運行的總數和工作,因爲它應該 - 你的限制是10,你的頁面是1和返回的記錄數是10,因此[10 * 0 + 10] = 10,其中就好像你在第2頁一樣,它會是[10 * 1 + 10] = 20。如果你跳到第10頁,它將會是[10 * 9 + 10] = 100。如果你的限制是10,是正確的 – pieperu