Mongo DB和Go - 使用动态数据模型

时间:2016-01-25 17:32:20

标签: mongodb go mgo

我遇到了一个问题,我不知道要走哪条路。所以我在这里问。我有一个应用程序,其中可以有产品,并且可以有产品的元数据。可以从前端创建和删除这些元数据。因此,让我们说,今天每个产品都有两个元数据(例如名称,价格),然后明天它可以是三个,四个或更多,甚至不到两个。所以这是动态的。我试图将数据表示如下

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
}

正如您所看到的,这是一种纯粹的动态情况,因此在代码级别拥有代表模型的结构是不可能的。

我的问题是,如何使用mgo和Go lang实现这样的事情?如果我需要使用反射,那么可以请一些人指向一个好的博客/教程,我可以获得更多的信息。或者,如果您认为数据建模方法存在根本问题,请更正我,以便可以使用Go轻松实现。

在Python中,实现它不会有问题。我知道。但我对Go实施感到困惑。

请帮忙。

提前致谢

1 个答案:

答案 0 :(得分:3)

如果元数据的密钥是唯一的,为什么不使用地图。

表示您的Product结构如下:

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
}

如果您可以拥有多个给定元数据的实例,即:2个类别,请使用列表:

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
}