C# 对文档进行分页和计数的有效方法

C# 对文档进行分页和计数的有效方法,c#,mongodb,pagination,C#,Mongodb,Pagination,我正在开发一些简单的表格小部件(在前端),用于显示分页数据。 所以在从mongo db过滤数据之后,我需要在跳过和限制之前对它们进行计数。我的方法有效率吗 var count = _database.GetCollection<BsonDocument>("alarms").Find(filter).Count(); var result = _database.GetCollection<BsonDocument>("alarms").Find(filter).So

我正在开发一些简单的表格小部件(在前端),用于显示分页数据。 所以在从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 } };
var count=_database.GetCollection(“报警”).Find(filter.count();
var result=_database.GetCollection(“报警”).Find(filter).Sort(Sort).Limit(Limit).Skip(Limit*(page-1)).ToListAsync();
var数据=新的BsonArray(result.result);
返回新的BsonDocument{{“data”,data},{“count”,count};

对于正在运行的总计,您是否可以不执行计数查询,而直接使用页面和限制参数进行计数

所以

var skip=limit*(第1页);
var result=\u database.GetCollection(“报警”)
.查找(筛选器)
.Sort(排序)
.Skip(Skip)
.限额
.ToListAsync();
var数据=新的BsonArray(result.result);
变量计数=(限制*(第1页))+result.count();
返回新的BsonDocument{{“data”,data},{“count”,count};
省去了为计数打额外的电话

但是,要为过滤器检索所有匹配文档的计数,您需要按原样执行额外的计数,如果您对数据具有所有必要的索引,这对于您想要实现的目标来说并不是非常低效,因为计数只返回int,而不返回集合中的实际数据


旁注,在限制()之前,您需要跳过()

我需要整个集合计数,这样我就可以制作“跳转到第10页”等按钮。当我在第1页并获取10条记录时,您的方法会在过滤后生成计数=10*0+10=10,而不是27k条记录。事实上,如果希望集合中的全部记录为它们可以跳转到的每个页面提供链接,则需要单独检索。抱歉,我误解了,我给你的代码是一个运行总数,它应该是正常工作的-你的限制是10,你的页面是1,返回的记录数是10,因此[10*0+10]=10,如果你在第2页,它应该是[10*1+10]=20。如果你跳到第10页,它就是[10*9+10]=100。如果你的限制是10,这是正确的
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} };