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 是基于上次的结果。

相关推荐
Leon-Ning Liu1 分钟前
【真实经验分享】Oracle RAC 修改 db_file_name_convert / log_file_name_convert 参数实践
数据库·oracle
影寂ldy12 分钟前
C# 多线程进阶知识点(线程优先级、多委托传参、线程锁、死锁)
开发语言·数据库·c#
Leon-Ning Liu21 分钟前
【真实经验分享】Oracle RAC + ASM 下 db_recovery_file_dest 路径格式导致 ORA-01261 无法 NOMOUNT
数据库·oracle
QN1幻化引擎42 分钟前
# DalinX V8 灵鉴 V2:12维意识评测框架 —— 从 Tononi IIT 到 Friston FEP 的理论统一
数据库·人工智能·算法·机器学习·数据挖掘·agi
聚美智数1 小时前
常见疾病查询-疾病症状—疾病介绍-疾病大全-疾病治疗查询API接口介绍
android·java·数据库
观远数据1 小时前
经营闭环的最后一公里:从看见问题到解决问题之间还差什么
java·开发语言·数据库
延凡科技1 小时前
数字孪生全域智慧园区综合可视化运营平台|延凡科技智园视界解决方案
数据库·人工智能·物联网·数据可视化
SelectDB技术团队1 小时前
大规模集群治理:Apache Doris / SelectDB 的 CCR 无感升级、Colocate Join 与 Bitmap 精确去重
大数据·数据库·人工智能·agent·olap·selectdb·集群治理
卓怡学长8 小时前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
J-Tony1111 小时前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql