2017-04-18 8 views
1

私はGoでMongoDBとmgoをストレージエンジンとして使用してAPIを作成しています。 GETリクエストの抽象化の一種として、クエリ文字列パラメータのフィールドで結果をフィルタリングできるようにしましたが、文字列フィールドに対してのみ機能します。Go mgo getフィールドタイプ

私は、コレクションで検索する前に、型を正しい型にキャストするためにフィールド名のみを持つフィールドの型を取得する方法を探しています。ここで コードです:MongoDBので

func (db *DataBase) GetByFields(fields *map[string]interface{}, collection string) ([]DataModel, error) { 
    var res []interface{} 

    Debug("Getting " + collection + " by fields: ") 
    for i, v := range *fields { 
     Debug("=> " + i + " = " + v.(string)) 
     // Here would be the type checking 
    } 

    if limit, ok := (*fields)["limit"]; ok { 
     limint, err := strconv.Atoi(limit.(string)) 
     if err != nil {...} // Err Handling 
     delete(*fields, "limit") 
     err = db.DB.C(collection).Find(fields).Limit(limint).All(&res) 
     if err != nil {...} // Err Handling 
    } else { 
     err := db.DB.C(collection).Find(fields).All(&res) 
     if err != nil {...} // Err Handling 
    } 

    resModel := ComputeModelSlice(res, collection) 
    return resModel, nil 
} 

私は種類を確認することができます。

db.getCollection('CollectionName').findOne().field_name instanceof typeName 

しかし、私は、MgOとのことを実行する方法を見つけることができません。

答えて

1

私は、クエリを実行する前に、フィールドの種類を取得する方法についてはよく分からないんだけど、oneアプローチは、単にbson.Mに照会して、取得した値に型検出を行うことです。

var res bson.M 
// ... 
err = db.DB.C(collection).Find(fields).Limit(limint).All(&res) 
// ... 
for key, val := range res { 
    switch val.(type) { 
    case string: 
    // handle 
    case int: 
    // handle 
    // ... 
    default: 
    // handle 
    } 
} 
関連する問題