前言
众所周知,MongoDB 是一个通用、基于文档的分布式数据库,非常适合云原生服务的应用场景。上一篇文章已经简单介绍了 MongoDB 数据库的中间件工具 mgm 的一般使用方法,今天就来聊一聊 mgm 的高级使用方法。
正文
数据库记录中的默认项
在声明数据库模型时,如果使用 DefaultModel ,就会在数据库中生成记录时,自己生成三个默认项,分别是 _id
、 created_at
、updated_at
。其中,_id
表示文档记录的ID,created_at
表示文档记录生成的时间、updated_at
表示文档记录的更新时间,一般updated_at
会比created_at
较新,至少是相等的。
接下来,通过声明一个数据库模型结构体来了解一下这些默认项。
代码如下:
typeFilestruct { mgm.DefaultModel`bson:",inline"`// 产生默认三项Namestring`json:"name" bson:"name"`Md5string`json:"md5" bson:"md5"`Typestring`json:"type" bson:"type"`Urlstring`json:"url" bson:"url"`Pathstring`json:"path" bson:"path"`FilePathstring`json:"filepath" bson:"filepath"`Durationfloat64`json:"duration" bson:"duration"`CloudUrlstring`json:"cloudurl" bson:"cloudurl"`Filekeystring`json:"filekey" bson:"filekey"`MinioUrlstring`json:"miniourl" bson:"miniourl"`MinioKeystring`json:"miniokey" bson:"miniokey"`Sizeint64`json:"size" bson:"size"`Identifierstring`json:"identifier" bson:"identifier"`ETagstring`josn:"eTag" bson:"eTag"`}
几条数据库记录截图如下:
从上图我们可以看到数据库记录中默认的三个字段( _id
、 created_at
、updated_at
)。
数据库记录中的钩子函数
数据库中声明的每一个模型都是如下钩子函数:
Creating
: 当创建一个新模型的时候触发。Created
: 当一个新模型被创建后触发。Updating
: 当正在更新一个模型时触发。Updated
: 当一个模型被更新后触发。Saving
: 当创建或者升级一个模型时触发。Saved
: 当一个模型被创建或者升级后触发。Deleting
: 当删除一个模型时触发。Deleted
: 当删除一个模型后触发。
其实,每一个数据库模型都会默认触发Creating
和Saving
两个钩子函数,如果你想定义自己的钩子函数,也要合理的利用默认的钩子函数,比如如下代码实例:
func (model*Book) Creating() error { // 调用默认的 Creating 钩子函数iferr :=model.DefaultModel.Creating(); err!=nil { returnerr } // 定义自己的校验逻辑ifmodel.Pages<0 { returnerrors.New("page paramter error") } returnnil}
另外,可以触发上述钩子函数的方法有很多,比如Create
、CreateWithCtx
、Update
、UpdateWithCtx
、Delete
、DeleteWithCtx
。
数据库配置项
这里需要说明一个非常重要的数据库配置项——上下文超时时间,这个在实际使用过程,自己曾多次踩坑,特别是当网络非常差的时候,当访问数据库时总是莫名其妙的连接失败,最终定位原来问题出在了这里。
因此,建议在我们使用 mgm 的时候,一定要设置一个合适的上下文超时时间,本人项目的代码实例如下:
funcSetupMongoDB() error { err :=mgm.SetDefaultConfig(&mgm.Config{CtxTimeout: 10*time.Second}, *config.GetConfig().Mongo.Db, options.Client().ApplyURI(*config.GetConfig().Mongo.Url)) returnerr}
结尾
好了,今天关于 mgm 的高级使用方法就介绍这么多,晚安😴 !大家好,我是 liuzhen007,欢迎关注,分享更多服务器和数据库的知识。
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!😄