MongoDB max 获取最大值 (Golang)

2022-07-19 17:09:45 浏览数 (1)

某个集合, 要获取某个字段的最大值,有两种办法,一个是用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很快,

反之,没有索引的情况下,聚合要快。

0 人点赞