2020年3月2日 星期一

golang mongodb bson.M 如何解析多維陣列(multi-dimension slice : [][]interfae{}),或未知欄位數的資料?

mangodb中一維的資料可以採用 []interface{}來轉換取出,如下例:
    type User struct {
        Id_     bson.ObjectId `bson:"_id"`
        Name    string        `bson:"name"`
        Age     int           `bson:"age"`
        Friends []interface{} `bson:"friends"`
    }



但是若mondodb中的Friends記錄的是多維的資料,如: [][][]interface{}
確無法單純把定義改為如下,雖然程式執行不會有錯誤,但是資料內容確只有一個空的slice。
    type User struct {
        Id_     bson.ObjectId     `bson:"_id"`
        Name    string            `bson:"name"`
        Age     int               `bson:"age"`
        Friends [][][]interface{} `bson:"friends"`
    }

或,單一interface{}去接資料,也只是得到一個nil。
    type User struct {
        Id_     bson.ObjectId `bson:"_id"`
        Name    string        `bson:"name"`
        Age     int           `bson:"age"`
        Friends interface{}   `bson:"friends"`
    }

解決方式: 不定義結構,先用 interface{}將所有欄位資料取回再後續處理
func GetData() {
    var i interface{}
    var err error
    if i, err = mgoDao.GetMongoData(); err == nil && i != nil {
        if reflect.TypeOf(i.(bson.M)["friends"]) == reflect.TypeOf([]interface{}{}) {
            for _, arr1 := range i.(bson.M)["friends"].([]interface{}) {
                if reflect.TypeOf(arr1) == reflect.TypeOf([]interface{}{}) {
                    for _, arr2 := range arr1.([]interface{}) {
                        if reflect.TypeOf(arr2) == reflect.TypeOf([]interface{}{}) {
                            if len(arr2.([]interface{})) > 2 {
                                friendName := fmt.Sprintf("%v", arr2.([]interface{})[0])
                                friendTel := fmt.Sprintf("%v", arr2.([]interface{})[1])
                                friendDesc := fmt.Sprintf("%v", arr2.([]interface{})[2])
                                if debugLog {
                                    stdLog.Println(tools.GoID(), friendName, friendTel, friendDesc)
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return
}




沒有留言:

張貼留言