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語言的多線程,能夠很快的查詢和聚合
相關文章
相關標籤/搜索