SRC
SRC

Reputation: 2271

Mongo DB and Go - using dynamic data models

I am faced with a problem where I am not sure which path to take. So I am asking it here. I have an application where there can be products and there can be metadata for a product. These metadata can be created and deleted from the front end. So let's say, today a each product has two meta data (e.g. Name, Price) then tomorrow it can be three, four or more or even less than two. So this is dynamic. I am trying to represent the data as follows

Product = 
{
    "_id": mongo
    "Name": string
    "Description": string
    "BasePrice": number
    "CreatedBy": user mongo _id
    "CreatedAt": timestamp
    "ModifiedAt": timestamp
    "MetaData": BSON object (having all the keys from ProductMetadata collection and their values. e.g. {"Category": "table ware", "Material": "oak wood, copper", "Length": 5.6})

}

ProductMetadata = 
{
    "_id": mongo
    "Name": string (e.g. - "Category" or "Material" or "Height")
    "Type": string (indicating what kind of value it can hold like string/integer/array. e.g. - "string")
    "CreatedAt": timestamp
    "ModifiedAt": timestamp
}

As you can see this is a pure dynamic situation so having a structure at the code level which represent the model is impossible.

My problem is, how do I implement such a thing using mgo and Go lang? If I need to use reflection then can some one please point me towards a good blog/tutorial where I can get a little bit more info. Or if you think that there is a fundamental problem in the approach of modeling the data then please correct me so that it can be easily implemented using Go.

In Python, it would not be a problem to implement this. I know that. But I am confused about the Go implementation.

Please help.

Thanks in advance

Upvotes: 2

Views: 1988

Answers (1)

David Budworth
David Budworth

Reputation: 11646

If Keys for metadata are unique, why not just use a map.

meaning your Product struct looks like:

struct Product {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name string
    Description string
     ... omitted other fields ...
    MetaData map[string]map[string]interface{} // map of string -> map of string -> anything
}

If you can have more than one instance of a given meta data, ie: 2 categories, use a list:

struct Product {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name string
    Description string
     ... omitted other fields ...
    MetaData []map[string]interface{} // list of maps of string -> anything
}

Upvotes: 3

Related Questions