1. GO 中使用mongodb
1.1. install
go get go.mongodb.org/mongo-driver@v1.1.2
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
1.2. 使用中需要注意
- go.mongodb.org 需要 FQ
- context 上下文
- options 配置
- Bson 使用
1.3. Bson使用
func BsonToOdj(val interface{}, obj interface{}) (error) {
data, err := bson.Marshal(val)
if err != nil {
return err
}
bson.Unmarshal(data, obj)
return nil
}]
//转成自己定义的类型
retBson ,_:= GetData(...)
result := DataStruct{}
MgoDb.BsonToOdj(retBson, &result)
1.4. DEMO
type MgoDbType struct {
Con *mongo.Client
DbName string
Ctx context.Context
}
func MgoInit() *MgoDbType {
m := &MgoDbType{}
m.getMgoCon()
return m;
}
func (m *MgoDbType) getMgoCon() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
m.DbName = "dbName"
clientOptions.SetAuth(options.Credential{AuthMechanism: "SCRAM-SHA-1", AuthSource: m.DbName, Username: "user", Password: "pass"})
ctx := context.Background()
m.Ctx = ctx
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatal(err)
return nil
}
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
return nil
}
m.Con = client
return client
}
func (m *MgoDbType) GetData(collectName string, ctm int64) (bson.M, error) {
findOneOptions := options.FindOne()
filter := bson.M{"_id": ctm}
var result bson.M
err := m.Con.Database(m.DbName).
Collection(collectName).
FindOne(context.TODO(), filter, findOneOptions).Decode(&result)
if err != nil {
return nil, err
}
return result, nil
}
1.5. 使用 upsert 使用反射自定义类型转换bsonM
func SaveDataUpsert(m *MgoDb.MgoDbType,collectName string, ctm int64,kData DataStruct) (*mongo.UpdateResult,error) {
UpdteOptions := options.Update()
UpdteOptions.SetUpsert(true)
filter := bson.M{"_id": ctm}
SetArrs := bson.M{}
t := reflect.TypeOf(kData)
v := reflect.ValueOf(&kData).Elem()
for i:=0;i<t.NumField();i++{
field := t.Field(i)
SetArrs[field.Tag.Get("json")] = v.FieldByName(field.Name).Interface()
}
updateResult, err := m.Con.Database(m.DbName).
Collection(collectName).
UpdateOne(m.Ctx,filter,bson.M{"$set":&SetArrs},UpdteOptions)
if err != nil {
return nil, err
}
return updateResult, nil
}