Commit 37fa6718 authored by zhengyaoqiu's avatar zhengyaoqiu

feat(database): mongodb 初始化

parent 684e445d
package model
//go:generate goctl template init --home ./templates
//go:generate goctl model mongo --type Product --dir product --home ./templates
package model
import (
"context"
"github.com/zeromicro/go-zero/core/stores/mon"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type Model[T any] interface {
Find(ctx context.Context, filter bson.M, findOptions ...*options.FindOptions) ([]T, int64, error)
FindOne(ctx context.Context, filter bson.M, findOneOptions ...*options.FindOneOptions) (T, error)
UpdateOne(ctx context.Context, filter bson.M, update bson.D, updateOptions ...*options.UpdateOptions) (*mongo.UpdateResult, error)
Traverse(ctx context.Context, filter bson.M, f func(document T) (bool, error), findOptions ...*options.FindOptions) error
BulkWrite(ctx context.Context, writeModels []mongo.WriteModel, opts ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error)
}
type BaseModel[T any] struct {
model *mon.Model
}
func NewBaseModel[T any](model *mon.Model) *BaseModel[T] {
return &BaseModel[T]{model: model}
}
func (receiver *BaseModel[T]) Find(ctx context.Context, filter bson.M, findOptions ...*options.FindOptions) ([]T, int64, error) {
total, err := receiver.model.CountDocuments(ctx, filter)
if err != nil {
return nil, 0, err
}
var documents []T
err = receiver.model.Find(ctx, &documents, filter, findOptions...)
return documents, total, err
}
func (receiver *BaseModel[T]) FindOne(ctx context.Context, filter bson.M, findOneOptions ...*options.FindOneOptions) (T, error) {
var document T
err := receiver.model.FindOne(ctx, &document, filter, findOneOptions...)
return document, err
}
func (receiver *BaseModel[T]) UpdateOne(ctx context.Context, filter bson.M, update bson.D, updateOptions ...*options.UpdateOptions) (*mongo.UpdateResult, error) {
return receiver.model.UpdateOne(ctx, filter, update, updateOptions...)
}
func (receiver *BaseModel[T]) Traverse(ctx context.Context, filter bson.M, f func(document T) (bool, error), findOptions ...*options.FindOptions) error {
cursor, err := receiver.model.Collection.Find(ctx, filter, findOptions...)
if err != nil {
return err
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var document T
err = cursor.Decode(&document)
if err != nil {
return err
}
next, err := f(document)
if err != nil {
return err
}
if !next {
return nil
}
}
return nil
}
func (receiver *BaseModel[T]) BulkWrite(ctx context.Context, writeModels []mongo.WriteModel, opts ...*options.BulkWriteOptions) (*mongo.BulkWriteResult, error) {
return receiver.model.BulkWrite(ctx, writeModels, opts...)
}
package model
import "go.mongodb.org/mongo-driver/mongo/options"
func PaginationOption(page, size int64) *options.FindOptions {
if page <= 0 {
page = 1
}
if size <= 0 {
size = 10
}
opt := options.Find()
skip := (page - 1) * size
opt.SetSkip(skip).SetLimit(size)
return opt
}
func UpsertOption() *options.UpdateOptions {
return options.Update().SetUpsert(true)
}
package model
import (
"errors"
"github.com/zeromicro/go-zero/core/stores/mon"
)
var (
ErrNotFound = mon.ErrNotFound
ErrInvalidObjectId = errors.New("invalid objectId")
)
package model
import "github.com/zeromicro/go-zero/core/stores/mon"
var _ ProductModel = (*customProductModel)(nil)
type (
// ProductModel is an interface to be customized, add more methods here,
// and implement the added methods in customProductModel.
ProductModel interface {
productModel
}
customProductModel struct {
*defaultProductModel
}
)
// NewProductModel returns a model for the mongo.
func NewProductModel(url, db, collection string) ProductModel {
conn := mon.MustNewModel(url, db, collection)
return &customProductModel{
defaultProductModel: newDefaultProductModel(conn),
}
}
// Code generated by goctl. DO NOT EDIT.
package model
import (
model "git.chillcy.com/golang/colorway/internal/pkg/database/mongo"
"github.com/zeromicro/go-zero/core/stores/mon"
)
type productModel interface {
model.Model[Product]
}
type defaultProductModel struct {
conn *mon.Model
model.Model[Product]
}
func newDefaultProductModel(conn *mon.Model) *defaultProductModel {
return &defaultProductModel{
conn: conn,
Model: model.NewBaseModel[Product](conn),
}
}
package model
import (
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Product struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
// TODO: Fill your own fields
UpdateAt time.Time `bson:"updateAt,omitempty" json:"updateAt,omitempty"`
CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
}
// Code generated by goctl. DO NOT EDIT.
package model
import (
model "git.chillcy.com/golang/colorway/internal/pkg/database/mongo"
{{if .Cache}}"github.com/zeromicro/go-zero/core/stores/monc"{{else}}"github.com/zeromicro/go-zero/core/stores/mon"{{end}}
)
{{if .Cache}}var prefix{{.Type}}CacheKey = "cache:{{.lowerType}}:"{{end}}
type {{.lowerType}}Model interface{
model.Model[{{.Type}}]
}
type default{{.Type}}Model struct {
conn {{if .Cache}}*monc.Model{{else}}*mon.Model{{end}}
model.Model[{{.Type}}]
}
func newDefault{{.Type}}Model(conn {{if .Cache}}*monc.Model{{else}}*mon.Model{{end}}) *default{{.Type}}Model {
return &default{{.Type}}Model{
conn: conn,
Model: model.NewBaseModel[{{.Type}}](conn),
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment