我们的应用程序提供的功能使客户能够创建动态表单和业务规则 . 我们最近决定探索Google基础架构,因此我们不必花时间调整和调整基础架构 .

到目前为止,我们已经使用NOSQL数据库(例如arangodb)很好地管理随机数据集,通过他们的JSON HTTP REST API存储任何类型的数据结构,只要它是有效的JSON . 但是,Google数据存储转到客户端库并且数据存储区不能使用JSON并且还会施加规则,例如没有silce []类型,没有 Map 映射[类型]类型失败,例如 datastore: invalid Value type e.t.c

我探索了实现PropertyLoadSaver接口加载/保存功能的选项,并修改了创建PropertyList和Property来创建一个[]属性 . 集合下面的案例是 type Collection map[string]interface{} ,其中包含一种数据集

func (m Collection) Save() ([]datastore.Property, error) {
    data := []datastore.Property{}
    for key, value := range m {
        if util.IsSlice(value) {
            props := datastore.PropertyList{}
            for _, item := range value.([]string) {
                props = append(props, datastore.Property{Name: key, Value: item})
            }
            data = append(data, datastore.Property{Name: key, Value: props})
        } else {
            data = append(data, datastore.Property{Name: key, Value: value, NoIndex: true})
        }
    }

    json.NewEncoder(os.Stdout).Encode(data)

    return data, nil
}

是的,我们可以创建一个可以根据 Map 数据填充的结构,并将其保存到数据存储区 . 然而,我们想知道是否有更简单的方法来接收 Map 并将其保存到数据存储区而不会增加复杂性 .

替代

type Person struct{
 Name string
 Surname string
 Addresses []Address
 ...
}

type Address struct{
  Type string
  Detail string
}

这个 map[string]interface{}{Name:"Kwasi", Surname:"Gyasi-Agyei", Addresses:...} 可以被编组到上面的struct中,由Datastore go client lib保存 .

然而,我更感兴趣的是利用PropertList,[]属性,除非该路由不必要地复杂 . 基本上要问的是,哪种方法最适合提供与无模式数据库相同的灵活性 .