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