某个集合, 要获取某个字段的最大值,有两种办法,一个是用sort, 另一个是用聚合(Aggregate),下面是代码演示:
sort:
代码语言:javascript复制var ID uint64
func initIDEx() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(),clientOptions)
if err != nil {
return
}
db := client.Database("test")
col := db.Collection("colA")
findOp := options.FindOne()
findOp.SetSort(bson.D{{"id", -1}})
rst := col.FindOne(context.TODO(), bson.D{}, findOp)
var a testStruct
if err := rst.Decode(&a); err == nil {
ID = a.ID
println(ID)
}
}
聚合:
代码语言:javascript复制var ID uint64
func initID() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(),clientOptions)
if err != nil {
return
}
db := client.Database("test")
col := db.Collection("colA")
pip := mongo.Pipeline{bson.D{
{"$group", bson.D{
{"_id", ""},
{"maxid", bson.D{{"$max", "$id"}}},
},
}},
}
cur, err := col.Aggregate(context.TODO(), pip)
if err != nil {
log.Println(err)
return
}
defer cur.Close(context.TODO())
var results []bson.M
cur.All(context.TODO(), &results)
for _, result := range results {
fmt.Println(result)
if v, ok := result["maxid"]; ok {
println("max id is ", v.(int64))
ID = uint64(v.(int64))
}
}
}
总结一下:
两种办法的性能,在不同的场景下,会有很大差异
如果查找的字段有设置index,那么sort很快,
反之,没有索引的情况下,聚合要快。