mongodb 取欄位最大值

charliecen發表於2021-12-23

由於表使用了redis自增的ID, 如果redis的資料誤刪,導致自增ID會重複,所以這裡會增加判斷,如果相等,則獲取最大ID

// mongo shell
db.user.aggregate([{"$group":{"_id":"", "max":{"$max":"$id"}}}])

// 結果
{
    "_id" : "",
    "max" : NumberLong(4)
}

// 同樣可以
db.user.find().sort({id:-1}).skip(0).limit(1);
// 自增ID
func (this *Slideshow) GetId() (id int64, err error) {
    key := "model_table_id"
    b, err := svc.ServiceContextObj.RedisClient.Exists(key)
    if err != nil {
        return 0, err
    }
    if b == false { //不存在設為1,並返回
        svc.ServiceContextObj.RedisClient.Set(key, "1")
        return 1, nil
    }
    incr, err := svc.ServiceContextObj.RedisClient.Incr(key)
    // 查詢表
    table, _ := this.FindOneById(incr)
    // 如果存在,則獲取最大ID + 1, 解決自增衝突
    if table.Id == incr {
        incr = this.FindMaxId() + 1
    }
    return incr, err
}

// 根據id查詢
func (this *Slideshow) FindOneById(id int64) (*Slideshow, error) {
  filter := bson.D{{"id", id}}
  err := this.db.FindOne(context.TODO(), filter).Decode(this)
  return this, err
}

// 查詢最大ID
func (this *Slideshow) FindMaxId() int64 {
    filter := []bson.M{
        {
            "$group": bson.M{
                "_id": "",
                "max": bson.M{"$max": "$id"},
            },
        },
    }
    var result []bson.M
    cur, err := this.db.Aggregate(context.TODO(), filter)
    if err != nil {
        logx.Error(err)
    }
    _ = cur.All(context.TODO(), &result)
    return result[0]["max"].(int64)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章