0

I am trying to receive data from my MongoDB using MGO in a map of type []map[string]interface{}

My JSON looks like this -

{
   "_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"
}

I would ideally pass in the category name i.e. 'television' and cat and subCat values which could be optional.

For e.g. something like this -

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

In which case I would expect to find '15' which is the warrantyPeriod value for T2 if there are no T2A or T2B specified.

My query functions look like this -

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))

My GetMappedFields function looks like this -

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

I'm just not able to wrap my head around this nested structure which sometimes returns a map and sometimes an interface! Any help would be highly appreciated!

1 Answer 1

1

you can do something like this

    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"]
                        }
                    }
                }
            }
        }
    }

Hopefully this will do dynamically or you can create a struct so that it can directly be decoded into that cheers

Sign up to request clarification or add additional context in comments.

1 Comment

Awesome! This is what I needed!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.