mgo作分页的几种方法

场景

  • 当数据量足够大的时候,一页展现不完的时候,咱们常常会须要分页的功能。

方案

方案一,数据不是很大

  • 须要排序
s := globalS.Copy()
    c := s.DB(db).C(collection)
    defer s.Close()
    return c.Find(query).Select(selector).Sort(sort).Skip(100).Limit(20).All(result)

这中状况只适用于数据量比较小的时候,当数据量达到必定量,sort会内存益处报错多线程

方案二,数据比较大

  • 不须要排序
s := globalS.Copy()
    c := s.DB(db).C(collection)
    defer s.Close()
    return c.Find(query).Select(selector).Skip(100).Limit(20).All(result)

当数据量比较大的时候,能够使用这种状况。若是须要排序,那就取得返回值后在排序。线程

方案三,数据比较大,排序

  • 须要排序
var result []interface{}
    s := globalS.Copy()
    c := s.DB(db).C(collection)
    defer s.Close()
    pipeM := []bson.M{
        {"$match": bson.M{"status": "true"}},
        {"$skip": start},
        {"$limit": end},
        {"$sort": bson.M{"height": -1}},
    }
    pipe := c.Pipe(pipeM)
    err = pipe.All(&result)

当数据量比较大的时候,而且须要排序的时候,能够使用这种状况。由于在skip,limit和sort同时出现的时候,因为有优先级,须要不管顺序如何,都是先执行sort,在执行skip,最后执行limit,可是咱们使用聚合,也就是mgo里面的pipeline,能够改变执行的前后顺序。code

结束语

  • 上面的三种状况都不适用大量的数据,首先是skip的限制,有人建议边查询边排序,我没有尝试
  • 若是数据量过大,我建议使用分库分表的方式来完成,这样加上GO语言的多线程,能够很快的查询和聚合
相关文章
相关标签/搜索