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.WithTimeout(context.Background(), 30*time.Second)
    ctx := context.Background()
    m.Ctx = ctx
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
        return nil
    }
    // Check the connection
    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)
        //这里通过json tag 取出 名称 Interface 类型 mongo 会对应类型
        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
}

results matching ""

    No results matching ""