MongoDB c#:关于分页的问题

Posted

技术标签:

【中文标题】MongoDB c#:关于分页的问题【英文标题】:MongoDB c# : Question about pagination 【发布时间】:2011-07-07 06:53:46 【问题描述】:

使用某些查询的分页结果,我需要从哪个页面获取点。当您将点推出范围时,该对象将返回位于正确页面上的数据,在此页面打开分页结果。 如果可以像这个示例一样获得分页结果,我如何从即将到来的页面中获取项目?

paging
.skip(PAGE_SIZE * (PAGE_NUMBER - 1)).limit(PAGE_SIZE)

    public List<BsonItem> GetData(QueryComplete query, int take, int skip, SortByBuilder sort)
        
            var cursor = Db.Data.FindAs<BsonItem>(query);

            if (skip > 0)
                cursor.SetSkip(skip);
            if (take > 0)
                cursor.SetLimit(take);
            if (sort != null )
                cursor.SetSortOrder(sort);
            return cursor.ToList();
        

感谢您的帮助。

【问题讨论】:

【参考方案1】:

页码应该(以及可能的排序顺序和方向)来自客户端。所以客户端点击某个页面然后...

我个人使用某种过滤器,其中包含您需要的所有属性。

使用该过滤器,您只需指定需要在网格中显示的页面以及每页需要多少项目。

var pageNumber = 1;// current page should come from the client
var filter = new BaseFilter()CurrentPage = pageNumber, ItemsPerPage = 30;
var items = GetItemsByFilter(filter, Query.LTE("SomeDate",DateTime.Now)),
                                     SortBy.Ascending("SortField"));
//For basic paging you only following three properties
var totalCount = filter.TotalCount; // here will be total items count
var pagesCount = filter.TotalPagesCount; // here will be total pages count
// pageNumber  = current page

您还可以从 BasicFilter 推断并添加查询、排序所需的任何属性。 这里过滤代码(希望对你有用):

 public List<Item> GetItemsByFilter(BaseFilter filter, 
                   QueryComplete query, SortByBuilder sort)
 
   var resultItems = new List<Item>();
   var cursor = Db.Data.FindAs<BsonItem>(query);

   cursor.SetSortOrder(sort);
   if (filter.IsNeedPaging)
   
     cursor.SetSkip(filter.Skip).SetLimit(filter.Take);
     filter.TotalCount = cursor.Count();
   

   resultItems.AddRange(cursor);

   return resultItems;
 


 public class BaseFilter
 
   private int _itemsPerPage = 10;
   private int _skip = 0;
   private int _currentPage = 1;

   public BaseFilter()
   
     IsNeedPaging = true;
   

   public int Skip
   
     get
     
       if (_skip == 0)
         _skip = (CurrentPage - 1) * _itemsPerPage;
       return _skip;
     
     set
     
       _skip = value;
     
   

   public int Take
   
     get
      
         return _itemsPerPage;
      
     set
      
        _itemsPerPage = value;
      
    

    public bool IsNeedPaging  get; set; 

    public int TotalCount  get; set; 

    public int CurrentPage
    
      get
        
           return _currentPage;
        
      set
        
          _currentPage = value;
        
    

    public int ItemsPerPage
    
      get
        
          return _itemsPerPage;
        
      set
        
          _itemsPerPage = value;
        
     

     public int TotalPagesCount
     
       get
         
           return TotalCount / ItemsPerPage + 
                            ((TotalCount % ItemsPerPage > 0) ? 1 : 0);
         
     
   

【讨论】:

对象是管理超出范围的项目而不是分页方法。您在某处有一个孤立的项目,您添加一个单击事件以在另一个页面的分页视图中打开,但是该点需要打开的页码是多少?我正在搜索在选择的正确页面上打开。 仅使用来自客户端的项目的_id(不管理方向或订单)

以上是关于MongoDB c#:关于分页的问题的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB分页的Java实现和分页需求的思考

mongodb 多表分页怎么查询

MongoDB(PyMongo)分页具有不同的不给出一致的结果

MongoDB分页获取数据排序阶段缓存溢出问题

如何使用MongoDB聚合进行分页?

MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题