AppEngine数据存储区使用Go编码一片切片

时间:2015-02-21 07:15:25

标签: google-app-engine go google-cloud-datastore

我需要在该数据存储区中存储一片切片。由于数据存储区不支持两级切片,因此我将子切片编码为JSON并将其存储为[]byte。我正在使用PropertyLoadSaver来完成此任务。保存和加载工作,但我注意到保存的实体为每个父元素都有一个空[]byte。经过一些调查后,我发现这是由Variants.OptionsJSON方法中引用的Save()属性以及结构的属性引起的。

所以我的问题是:

  • 这是一个错误还是我做错了什么?
  • 有没有更好的方法来实现这个目标?

我所拥有的一个约束是,我需要能够通过“Variant”属性之一查询实体,而不是“Variant.Options”。

谢谢!

示例:

给定JSON

{
  "variants": [{
    "options": [
      {
        "name": "One",
        "value": "one"
      },{
        "name": "Two",
        "value": "two"
      }]
    }, {
    "options": [
        {
        "name": "Three",
        "value": "three"
        },{
        "name": "Four",
        "value": "four"
        }]
    }]
  }]
}

如何将其存储在数据存储区中,注意最后两个空的'', ''属性:

Entity Kind: Products
Entity Key: ahBkZXZ-c3RvcmVza2ktY29tchULEghQcm9kdWN0cxiAgICAgNDHCww
ID: 6507459568992256
Variants.OptionsJSON (list): `['[{"name":"One","value":"one"},{"name":"Two","value":"two"}]', '[{"name":"Three","value":"three"},{"name":"Four","value":"four"}]', '', '']`

model.go

import (
    "appengine/datastore"
    "encoding/json"
)

type Option struct {
    Name  string `json:"name"`
    Value string `json:"value"`
}

type Variant struct {
    OptionsJSON []byte   `json:"-" datastore:"OptionsJSON"`
    Options     []Option `json:"options" datastore:"-"`
}

type Product struct {
    Variants []Variant `json:"variants"`
}

func (x *Product) Load(c <-chan datastore.Property) error {
    if err := datastore.LoadStruct(x, c); err != nil {
        return err
    }
    for i, v := range x.Variants {
        var opts []Option
        json.Unmarshal(v.OptionsJSON, &opts)
        x.Variants[i].Options = opts
    }
    return nil
}

func (x *Product) Save(c chan<- datastore.Property) error {
    for _, v := range x.Variants {
        b, _ := json.Marshal(v.Options)
        c <- datastore.Property{
            Name:     "Variants.OptionsJSON",
            Value:    b,
            NoIndex:  true,
            Multiple: true,
        }
    }
    return datastore.SaveStruct(x, c)
}

0 个答案:

没有答案