分页和计数文档的有效方式

时间:2016-10-18 10:05:51

标签: c# mongodb pagination

我正在处理一些简单的表格小部件(在前端)以使用分页来呈现数据。 因此,在从mongo db过滤数据后,我需要在跳过和限制之前对它们进行计数。我的方式有效吗?

 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 } };

1 个答案:

答案 0 :(得分:1)

对于正在运行的总计,您是否可以不假设计数包含您的页面和限制参数而不是执行计数查询?

所以...

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} };

保存进行额外的计数调用。

但是,要为您的过滤器检索所有匹配文档的计数,您需要按原样执行额外的计数,前提是您拥有数据的所有必要索引,对于您想要的内容并不是非常低效实现,看到count只返回一个int,而没有来自集合的实际数据。

旁注,你需要在Limit()

之前跳过()