大數據MongoDB之mgo驅動如何對查詢結果進行排序(正序逆序多字段排序)?

mgo - MongoDB driver for Go,是一個鏈接數據庫的開源工具。
咱們要如何使用mgo驅動對查詢結果進行排序呢?(正序逆序多字段排序)數據庫

文章目錄

  1.Sort() 方法
    1.1 能夠使用 Sort() 方法根據某個字段進行排序
    1.2 能夠逆序查詢,只要在字段名前加上 '-' 號就好
    1.3 也能夠多字段查詢
  2.源碼解析markdown


1.Sort() 方法

1.1 能夠使用 Sort() 方法根據某個字段進行排序

query1 := collection.Find(nil).Sort("name")
複製代碼

結果示例app

name time
Caochao 2019
Caochao 2017
Caochao 2018
Liubei 2018
Liubei 2017
Sunquan 2019
Sunquan 2018

Sort() 方法會接收你傳入的某個字段,而後向數據庫發送排序請求,再接收數據庫返回的結果。工具



1.2 能夠逆序查詢,只要在字段名前加上 '-' 號就好

query2 := collection.Find(nil).Sort("-name")
複製代碼

結果示例spa

name time
Sunquan 2018
Sunquan 2019
Liubei 2017
Liubei 2018
Caochao 2018
Caochao 2017
Caochao 2019



1.3 也能夠多字段查詢

字段在前的則是優先排序的,字段在後的就進行二級排序code

像下面的就是先根據名稱進行排序,再根據時間進行排序。orm

query1 := collection.Find(nil).Sort("name", "time")
複製代碼

結果示例排序

name time
Caochao 2017
Caochao 2018
Caochao 2019
Liubei 2017
Liubei 2018
Sunquan 2018
Sunquan 2019

2. 源碼解析

MongoDB傳參的方式是使用參數 1 與 -1 來指定的,如 db.COLLECTION_NAME.find().sort({KEY:1}) 就是根據key字段進行正序排序。而mgo是經過在字段名前加上 '+'-' 符號實現正反排序的操做的,跟咱們所熟悉的MongoDB的操做方式不太同樣。 mgo是怎麼用 '-' 實現正反序這樣的效果的?源碼

咱們能夠看看源碼string

func (q *Query) Sort(fields ...string) *Query {
   q.m.Lock()
   var order bson.D
   for _, field := range fields {
      n := 1
      var kind string
      if field != "" {
         if field[0] == '$' {
            if c := strings.Index(field, ":"); c > 1 && c < len(field)-1 {
               kind = field[1:c]
               field = field[c+1:]
            }
         }
         switch field[0] {
         case '+':
            field = field[1:]
         case '-':
            n = -1
            field = field[1:]
         }
      }
      if field == "" {
         panic("Sort: empty field name")
      }
      if kind == "textScore" {
         order = append(order, bson.DocElem{Name: field, Value: bson.M{"$meta": kind}})
      } else {
         order = append(order, bson.DocElem{Name: field, Value: n})
      }
   }
   q.op.options.OrderBy = order
   q.op.hasOptions = true
   q.m.Unlock()
   return q
}
複製代碼

下面是一些關鍵點,我挑出來給你們看一下

n := 1

switch field[0] {
case '+':
    field = field[1:]
case '-':
    n = -1
    field = field[1:]
}

order = append(order, bson.DocElem{Name: field, Value: n})
複製代碼

他先是默認按照正序排序( n := 1 ),再對傳進來的字段名進行篩選。若是字段名前面帶有 '-',則識別爲逆序排序,最後帶上參數 n 向MongoDB發送請求。

從這些關鍵地方咱們能夠知道,mgo的底層操做其實也是傳 1 與 -1 的參數的。可是它作了更好的封裝,讓咱們使用起來更爲簡單。

相關文章
相關標籤/搜索