mgo - MongoDB driver for Go,是一個鏈接數據庫的開源工具。
咱們要如何使用mgo驅動對查詢結果進行排序呢?(正序逆序多字段排序)數據庫
1.Sort() 方法
1.1 能夠使用 Sort() 方法根據某個字段進行排序
1.2 能夠逆序查詢,只要在字段名前加上 '-' 號就好
1.3 也能夠多字段查詢
2.源碼解析markdown
query1 := collection.Find(nil).Sort("name") 複製代碼
結果示例:app
name | time |
---|---|
Caochao | 2019 |
Caochao | 2017 |
Caochao | 2018 |
Liubei | 2018 |
Liubei | 2017 |
Sunquan | 2019 |
Sunquan | 2018 |
Sort() 方法會接收你傳入的某個字段,而後向數據庫發送排序請求,再接收數據庫返回的結果。工具
query2 := collection.Find(nil).Sort("-name") 複製代碼
結果示例:spa
name | time |
---|---|
Sunquan | 2018 |
Sunquan | 2019 |
Liubei | 2017 |
Liubei | 2018 |
Caochao | 2018 |
Caochao | 2017 |
Caochao | 2019 |
字段在前的則是優先排序的,字段在後的就進行二級排序。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 |
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 的參數的。可是它作了更好的封裝,讓咱們使用起來更爲簡單。