【问题标题】:Efficient way for pagination and count documents分页和计数文档的有效方法
【发布时间】:2017-02-27 13:17:33
【问题描述】:

我正在开发一些简单的表格小部件(在前端),用于通过分页呈现数据。 因此,在从 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 } };

【问题讨论】:

    标签: c# mongodb pagination


    【解决方案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() 之前先 Skip()

    【讨论】:

    • 我需要整个集合计数,这样我就可以制作“跳转到第 10 页”等按钮。当我在第 1 页并获取 10 条记录时,您的方法会产生 count = 10*0+10 = 10而不是过滤后的 27k 条记录。
    • 确实,如果您希望集合中的全部记录为他们可以跳转到的每个页面提供链接,您将需要单独检索它。抱歉我误解了,我给你的代码是一个运行总数,并且可以正常工作 - 你的限制是 10,你的页面是 1,返回的记录数是 10,因此 [10*0+10] = 10,其中就好像你在第 2 页,它会是 [10*1+10] = 20。如果你要跳到第 10 页,它只会是 [10*9+10] = 100。如果你的限制是10,是正确的
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2016-07-21
    • 2013-08-15
    相关资源
    最近更新 更多