Golang 从 MongoDB 的嵌套 json 数据映射中找到一个值

Golang find a value from a map of nested json data from MongoDB

我正在尝试在 []map[string]interface{}

类型的地图中使用 MGO 从我的 MongoDB 接收数据

我的JSON是这样的-

{
   "_id":"string",
   "brandId":123,
   "category":{
      "television":[
         {
            "cat":"T1",
            "subCategory":[
               {
                  "subCat":"T1A TV",
                  "warrantyPeriod":6
               }
            ],
            "warrantyPeriod":12
         },
         {
            "cat":"T2",
            "subCategory":[
               {
                  "subCat":"T2A",
                  "warrantyPeriod":18
               },
               {
                  "subCat":"T2B",
                  "warrantyPeriod":9
               }
            ],
            "warrantyPeriod":15
         },
         {
            "cat":"T3",
            "subCategory":[
               {
                  "subCat":"T3A",
                  "warrantyPeriod":3
               },
               {
                  "subCat":"T3B",
                  "warrantyPeriod":5
               },
               {
                  "subCat":"T3C",
                  "warrantyPeriod":7
               },
               {
                  "subCat":"T3D",
                  "warrantyPeriod":11
               }
            ],
            "warrantyPeriod":4
         }
      ],
      "television_warrantyPeriod":24
   },
   "title":"BrandName"
}

我最好传入类别名称,即 'television' 和 cat 以及 subCat 值,这些值可以是可选的。

例如像这样 -

{
"categorySlug": "television",
"brandId": "123",
"model": "T2"
}

在这种情况下,如果没有指定 T2A 或 T2B,我希望找到“15”,这是 T2 的 warrantyPeriod 值。

我的查询函数是这样的-

var data map[string]string
err := json.NewDecoder(r.Body).Decode(&data)
log.Println(err)
var buffer bytes.Buffer
buffer.WriteString("category.")
buffer.WriteString(data["categorySlug"])
brandId, _ := strconv.Atoi(data["brandId"])
concernedbrandandcategory := database.GetMappedFields("Brands", bson.M{"brandId": brandId, buffer.String(): bson.M{"$exists": true}}, bson.M{buffer.String(): 1})
categorymap := concernedbrandandcategory[0]
log.Println(categorymap["category"]["television"], reflect.TypeOf(categorymap))

我的 GetMappedFields 函数如下所示 -

func GetMappedFields(collectionName string, query interface{}, selector interface{}) (result []map[string]interface{}) {
    MgoSession.DB(Dbname).C(collectionName).Find(query).Select(selector).All(&result)
    return
}

我只是无法理解这个有时 returns 映射有时是接口的嵌套结构! 任何帮助将不胜感激!

你可以这样做

    majorCat := body["categorySlug"]
    category := body["category"]
    subCategory := body["subCategory"]
    brandId, err := strconv.Atoi(body["brandId"])
    if err != nil {
        log.Println(err)
    }
    result := database.GetMappedFields("Brands", bson.M{"brandId": brandId}, bson.M{"category": 1, "_id": 0})
    internalObj := result[0]["category"].(map[string]interface{})
    finalValue := internalObj["television_warrantyPeriod"]
    if category != "" {
        for _, v := range internalObj[majorCat].([]interface{}) {
            subObj := v.(map[string]interface{})
            if subObj["cat"] == category {
                finalValue = subObj["warrantyPeriod"]
                if subCategory != "" {
                    minorObj := subObj["subCategory"].([]interface{})
                    for _, iter := range minorObj {
                        kevVal := iter.(map[string]interface{})
                        if kevVal["subCat"] == subCategory {
                            finalValue = kevVal["warrantyPeriod"]
                        }
                    }
                }
            }
        }
    }

希望这会是动态的,或者您可以创建一个结构,以便它可以直接解码为欢呼声