使用 Postgres 和 MongoDB 进行 CRUD?

使用 postgres 和 mongodb 进行 crud?

php小编西瓜在本文中将带您了解如何使用Postgres和MongoDB进行CRUD操作。Postgres是一种关系型数据库,而MongoDB则是一种文档型数据库。CRUD操作指的是创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据的过程。通过结合使用这两种不同类型的数据库,您可以根据不同的需求选择最适合的数据库进行数据操作,以提高效率和灵活性。接下来,让我们一起来探索这两种数据库在CRUD操作中的应用吧!

问题内容

我对 Go 和后端还很陌生,并且正在参加 Go 实习计划。我们构建了一个连接到 psql 数据库的 CRUD,现在我被告知连接 mongoDB,我们将其用于开发,而 PSQL 将用于生产。我是否必须从头开始创建用于 mongo 的新处理程序,或者我可以使用相同的处理程序并以某种方式确定正在使用的数据库类型并相应地使用相应的逻辑吗?例如,我有一个用于用户注册端点的处理程序:

func (ctrl *UserController) Register(c *gin.Context) {    var user models.User    if err := c.BindJSON(&user); err != nil {        c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{            "error":   true,            "message": err.Error(),        })        return    }    err := ctrl.userService.Register(&user)    if err != nil {        c.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{            "error":   true,            "message": err.Error(),        })        return    }    c.JSON(http.StatusCreated, gin.H{        "message": "successfully created an user",    })}func (svc *UserService) Register(user *models.User) error {    if svc.userRepo.CheckIfEmailExists(user.Email) {        return errors.New("user already registered")    }    hash, err := svc.generatePasswordHash(user.Password)    if err != nil {        return errors.New("err can't register user")    }    user.Password = hash    return svc.userRepo.Insert(user)}func (repo *UserRepository) CheckIfEmailExists(mail string) bool {    var user models.User    err := repo.dbClient.Debug().Model(models.User{}).Where("email = ?", mail).Find(&user).Error    return errors.Is(err, gorm.ErrRecordNotFound)}func (repo *UserRepository) Insert(user *models.User) error {    err := repo.dbClient.Debug().Model(models.User{}).Create(user).Error    if err != nil {        log.Printf("failed to insert user: %v", err)        return err    }    return nil}

登录后复制

我为 mongo 构建了插入、注册和 CheckIfEmailExists 函数:

func (repo *UserRepository) InsertInMongo(user *models.UserB) error {    coll := repo.mongoClient.DB.Collection("users")    _, err := coll.InsertOne(context.TODO(), user)    if err != nil {        log.Printf("failed to insert user: %v", err)        return err    }    return nil}func (svc *UserService) RegisterToMongo(user *models.UserB) error {    check := svc.userRepo.CheckIfEmailExistsInMongo(user.Email)    if check {        return errors.New("user already registered")    }    hash, err := svc.generatePasswordHash(user.Password)    if err != nil {        return errors.New("err can't register user")    }    user.Password = hash    return svc.userRepo.InsertInMongo(user)}func (repo *UserRepository) CheckIfEmailExistsInMongo(email string) bool {    coll := repo.mongoClient.Collection    filter := bson.D{{Key: "email", Value: email}}    count, err := coll.CountDocuments(context.TODO(), filter)    if err != nil {        panic(err)    }    if count != 0 {        return true    }    return false}

登录后复制

解决方法

您没有提供如何创建 UserService 的代码。

理想情况下,您应该有一个如下所示的界面:

type UserRepository interface {    CheckIfEmailExists(mail string) bool    Insert(user *models.User) error    …}

登录后复制

然后,UserService 应该像这样创建:

// We use the interface as paramfunc NewUserService(userRepo UserRepository) UserService {    return UserService{        UserRepo: userRepo    }}

登录后复制

并且您将有两个单独的存储库,都实现 UserRepository 接口 – 这意味着它们应该具有与接口相同的名称和相同签名(参数、返回类型)的方法:

mongo_user_repository.go

Type MongoUserRepo struct {    …}func (repo MongoUserRepo) CheckIfEmailExists(mail string) bool {  … some mongo logic here}func (repo MongoUserRepo) Insert(user *models.User) error {  … some mongo logic here}

登录后复制

postgres_user_repository.go

type PostgresUserRepo struct {    …}func (repo PostgresUserRepo) CheckIfEmailExists(mail string) bool {  … some postgres logic here}func (repo PostgresUserRepo) Insert(user *models.User) error {  … some postgres logic here}

登录后复制

您可以根据用例传递其中任何一个,如下面的(非常糟糕的)示例:

main.go

…var userService UserServiceif os.Getenv(“environment”) == “prod” {    userService = NewUserService(postgreUserRepo)} else if os.Getenv(“environment”) == “dev” {    userService = NewUserService(mongoUserRepo)}

登录后复制

以上就是使用 Postgres 和 MongoDB 进行 CRUD?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2357182.html

(0)
上一篇 2025年3月1日 16:15:24
下一篇 2025年3月1日 16:15:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ao3官网进入链接

    ao3(Archive of Our Own)是一个非营利性粉丝小说、同人画和动漫等次文化的在线社区。 如何进入 ao3 网站 ao3(Archive of Our Own)是一个非营利性粉丝小说、同人画和动漫等次文化的在线社区。以下是如何…

    2025年3月2日
    100
  • 夸克浏览器片子入口 夸克看片免费网址入口

    本文介绍了夸克看片的免费网址,包括夸克影视、夸克视频、夸克浏览器和第三方平台,如草民影院、星空影院等。文章概述了每个平台的特色,例如在线观看影视、免费注册获取存储空间和会员解锁等。此外,还提醒读者注意使用广告拦截工具以提升观影体验。 以下是…

    2025年3月2日
    100
  • 俄罗斯的浏览器yandex网站入口_俄罗斯引擎yandex进入无需登录

    俄罗斯Yandex并非一个独立的浏览器,而是Yandex公司提供的综合性互联网服务平台,其核心功能是搜索引擎。  无需注册或登录,用户只需访问yandex.ru(或其他地区域名)即可直接使用搜索功能,如同使用Google搜索一样便捷。  虽…

    2025年3月2日
    100
  • 如何使用Go语言编写上门做菜系统中的用户注册模块?

    本文将介绍如何使用Go语言编写一个上门做菜系统的用户注册模块,我们将涵盖用户注册的基本业务流程并提供代码示例。 一、需求分析 首先,我们需要了解用户在我们的系统中需要完成的基本步骤。用户注册模块需要满足以下需求: 用户可以输入用户名、密码和…

    2025年3月1日
    100
  • ntuser.dat文件可不可以删除详情介绍

    php小编小新带来的文章将为您详细介绍ntuser.dat文件的作用和是否可以删除。ntuser.dat文件是windows系统中存储用户注册表信息的文件,删除该文件可能导致用户个性化设置丢失或系统出现问题。因此,建议用户不要随意删除ntu…

    2025年3月1日
    100
  • 从 Gorm 传入查询的 Postgres 数据类型不正确

    在使用 Gorm 进行 Postgres 数据库查询时,有时会遇到一个常见的问题:“从 Gorm 传入查询的 Postgres 数据类型不正确”。这个问题可能会导致查询结果不准确,给开发者带来困扰。在本文中,php小编鱼仔将为您解析这个问题…

    2025年3月1日
    200
  • 钉钉电脑版的意义在哪?

    现代办公离不开协作工具,钉钉作为国内领先的办公软件,备受企业和个人青睐。然而,在日常使用中,不少用户会遇到一些困惑,比如钉钉电脑版的意义是什么?它与手机端相比有哪些优势?怀着这些疑问,php小编鱼仔特地整理了这篇文章,将针对钉钉电脑版的意义…

    2025年3月1日
    200
  • 如何查看电脑配置?

    电脑配置是决定电脑性能的关键因素,了解自己的电脑配置对于日常使用、升级优化和故障排查都至关重要。想知道自己的电脑配置吗?别着急,php小编柚子将为您揭晓这一谜题。接下来,我们为您整理了一份详尽的指南,从硬件到软件,一步步带您深入了解您的电脑…

    2025年3月1日
    200
  • 平板电脑怎么登录电脑版QQ空间?

    对于平板电脑用户来说,登录电脑版qq空间是一个难题。针对这一问题,php小编柚子将为您提供一个详细便捷的指引。通过我们的分步教程,您将了解如何轻松地访问电脑版qq空间的全部功能。请继续阅读下文,获取详细步骤和解答。 一、平板电脑怎么登录电脑…

    2025年3月1日
    200
  • 实践指南:构建高效的Go语言微服务框架

    实践指南:构建高效的Go语言微服务框架 随着云计算、大数据和人工智能等技术的快速发展,微服务架构已经成为了软件开发领域的一种主流趋势。在微服务架构中,每个功能模块被拆分成独立的服务,通过网络相互通信,从而实现了系统的高内聚、低耦合、易扩展等…

    2025年3月1日
    200

发表回复

登录后才能评论