Golang调用MongoDB的表自动增长的 ID 永久保存在 MongoDB 中,并且每次获取的 ID 是基于上次的结果

以下是使用 MongoDB 的原子操作来实现自动增长 ID 并永久保存的方法:

Go 复制代码
package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/bson/primitive"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Counter struct {
    ID    string `bson:"_id"`
    Value int    `bson:"value"`
}

func getNextID(ctx context.Context, collection *mongo.Collection) (int, error) {
    update := bson.M{
        "$inc": bson.M{"value": 1},
    }
    upsert := true
    after := options.After
    opt := options.FindOneAndUpdateOptions{
        Upsert:         &upsert,
        ReturnDocument: &after,
    }
    var counter Counter
    err := collection.FindOneAndUpdate(ctx, bson.M{"_id": "documentIdCounter"}, update, &opt).Decode(&counter)
    if err!= nil {
        return 0, err
    }
    return counter.Value, nil
}

func main() {
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err!= nil {
        log.Fatal(err)
    }
    defer client.Disconnect(context.TODO())

    collection := client.Database("testdb").Collection("counters")

    for i := 0; i < 5; i++ {
        id, err := getNextID(context.TODO(), collection)
        if err!= nil {
            log.Fatal(err)
        }
        fmt.Println("Generated ID:", id)
        time.Sleep(time.Second)
    }
}

在这个示例中:

  • 定义了一个Counter结构体来表示存储自动增长 ID 的文档结构。
  • getNextID函数使用FindOneAndUpdate方法来原子性地增加计数器的值,并返回新的 ID。如果计数器文档不存在,会自动创建并初始化为 1。
  • 在主函数中,循环调用getNextID函数生成多个 ID,并打印出来。

这样可以确保自动增长的 ID 永久保存在 MongoDB 中,并且每次获取的 ID 是基于上次的结果。

相关推荐
安迁岚几秒前
【SQL Server】华中农业大学空间数据库实验报告 实验八 存储过程
数据库·sql·mysql·oracle
Achou.Wang6 分钟前
Redis过期时间和SORT命令的高级用法
数据库·redis·bootstrap
.ccc.。15 分钟前
mysql索引失效的五种情况
数据库
jnrjian1 小时前
OEM sql monitoring 类似SQL
数据库·sql
zxrhhm1 小时前
PostgreSQL 中约束Constraints
数据库·postgresql
惜.己2 小时前
Jmeter中的配置原件
java·前端·数据库
不烦下雨c2 小时前
[Qt从入门到精通] 信号和槽
开发语言·数据库·qt
好玩的Matlab(NCEPU)3 小时前
C#+数据库 实现动态权限设置
开发语言·数据库·c#
zybsjn3 小时前
MongoDB 和 Redis 是两种不同类型的数据库比较
数据库·redis·mongodb
树獭叔叔3 小时前
2K字速通MongoDB
数据库·后端·mongodb