由於表使用了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 協議》,轉載必須註明作者和本文連結