反转结构/结果的时间顺序

时间:2016-11-28 10:52:47

标签: mongodb sorting go time mgo

刚开始学习goLang。

想知道如何在Go中以相反的顺序对struct元素进行排序。让我们说,我从数据库得到的结果如下:

$lastId = User::create($userData)->id;

现在,我在切片var results []<someClass> collection.C(results).Find(bson.M{"<someid>":<id_val>}).All(&results) 中提供了数据库对象/结果。如何在名为time的列上以相反的顺序对切片results进行排序?

1 个答案:

答案 0 :(得分:4)

最简单的方法是让MongoDB对记录进行排序:

var results []YourType
err := sess.DB("").C("collname").Find(bson.M{"someid": "someidval"}).
    Sort("-timefield").All(&results)

如果由于某种原因您不能或不想这样做,您可以使用sort包。您需要实施sort.Interface

例如:

type YourType struct {
    SomeId    string
    Timestamp time.Time
}

type ByTimestamp []YourType

func (a ByTimestamp) Len() int           { return len(a) }
func (a ByTimestamp) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByTimestamp) Less(i, j int) bool {
    return a[i].Timestamp.After(a[j].Timestamp)
}

ByTimestamp类型是YourType的一个切片,它定义了反向时间戳顺序,因为Less()方法使用Time.After()来决定元素和索引{{1小于索引i的元素。

使用它(在Go Playground上试试):

j

var results []YourType // Run your MongoDB query here // Now sort it by Timestamp decreasing: sort.Sort(ByTimestamp(results)) 的替代实施方法是使用Time.Before(),但将索引Less()的元素与索引j进行比较:

i

Go Playground上尝试此变体。