English | 中文
tRPC-Go mongodb plugin

Base on community mongo, used with trpc.
mongodb client
client:
service:
- name: trpc.mongodb.xxx.xxx
target: mongodb://user:passwd@vip:port
timeout: 800
- name: trpc.mongodb.xxx.xxx1
target: mongodb+polaris://user:passwd@polaris_name
timeout: 800
package main
import (
"context"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"trpc.group/trpc-go/trpc-database/mongodb"
"trpc.group/trpc-go/trpc-go/log"
)
type BattleInfo struct {
Id string `bson:"_id,omitempty"`
Ctime uint32 `bson:"ctime,omitempty" json:"ctime,omitempty"`
}
func (s *server) SayHello(ctx context.Context, req *pb.ReqBody, rsp *pb.RspBody) (err error) {
proxy := mongodb.NewClientProxy("trpc.mongodb.xxx.xxx")
_, err = proxy.InsertOne(sc, "database", "table", bson.M{"_id": "key2", "value": "v2"})
opts := options.Replace().SetUpsert(true)
filter := bson.D{{"_id", "key1"}}
_, err := proxy.ReplaceOne(ctx, "database", "table", filter, &BattleInfo{}, opts)
if err != nil {
log.Errorf("err=%v, data=%v", err, *battleInfo)
return err
}
rst := proxy.FindOne(ctx, "database", "table", bson.D{{"_id", "key1"}})
battleInfo = &BattleInfo{}
err = rst.Decode(battleInfo)
if err != nil {
return nil, err
}
err = proxy.Transaction(ctx, func(sc mongo.SessionContext) error {
_, tErr := proxy.InsertOne(sc, "database", "table", bson.M{"_id": "key1", "value": "v1"})
if tErr != nil {
return tErr
}
_, tErr = proxy.InsertOne(sc, "database", "table", bson.M{"_id": "key2", "value": "v2"})
if tErr != nil {
return tErr
}
return nil
}, nil)
cmdDB := bson.D{}
cmdDB = append(cmdDB, bson.E{Key: "enableSharding", Value: "dbName"})
err = proxy.RunCommand(ctx, "admin", cmdDB).Err()
if err != nil {
return nil, err
}
cmdColl := bson.D{}
cmdColl = append(cmdColl, bson.E{Key: "shardCollection", Value: "dbName.collectionName"})
cmdColl = append(cmdColl, bson.E{Key: "key", Value: bson.D{{"openId", "hashed"}}})
cmdColl = append(cmdColl, bson.E{Key: "unique", Value: false})
cmdColl = append(cmdColl, bson.E{Key: "numInitialChunks", Value: 10})
err = proxy.RunCommand(ctx, "admin", cmdColl).Err()
if err != nil {
return nil, err
}
}
Frequently Asked Questions (FAQs)
- Q1: How to configure ClientOptions:
- A1: When creating a Transport, you can use WithOptionInterceptor to configure ClientOptions. You can refer to options_test.go for more information.