我如何使用Go编程语言在Google App Engine上实现一对多? 例如,如果我有下面的结构,我如何将多个投票的关联存储到一个注释中?我会在Comment结构中使用一个数组(切片)键来投票,还是从投票结构中使用注释的一个键?
type Comment struct {
Author string
Content string
Date datastore.Time
}
type Vote struct {
User string
Score int
}
答案 0 :(得分:17)
当前版本的Go AppEngine SDK中字段所允许的唯一类型是as follows:
鉴于此,似乎有两种方法可以做到这一点。一种是保持一片键指向给定注释的投票。然而,对于任何合理受欢迎的评论,这可能会超过100元素限制。
另一种方法是在每个投票结构中存储注释的“指针”,如下所示:
type Vote struct {
User string
Score int
CommentKey *datastore.Key
}
type Comment struct {
Author string
Content string
Date datastore.Time
}
然后当你去查询它时,你需要分两步完成。首先,你得到你感兴趣的评论(在这种情况下,只是第一个碰巧返回的评论)。其次,您查询“指向”该评论的所有投票:
q := datastore.NewQuery("Comment").Limit(1)
comments := make([]Comment, 0, 1)
var err os.Error
var keys []*datastore.Key
if keys, err = q.GetAll(c, &comments); err != nil {
// handle the error
}
comment := comments[0]
vq := datastore.NewQuery("Vote").Filter("CommentKey=", keys[0])
votes := make([]Vote, 0, 10)
if _, err := vq.GetAll(c, &votes); err != nil {
// handle the error
}
答案 1 :(得分:4)
如何使用祖先路径将投票存储为Comment的子项?我的意思是当您存储每个新的Vote结构时,设置父键参数指向父注释。像这样:
key, err := datastore.Put(context, datastore.NewIncompleteKey(context, model.DB_KIND_VOTE, commentKey), &vote)
答案 2 :(得分:-1)
我没试过这个,但也许值得一试:
type Vote struct {
User string
Score int
}
type Comment struct {
Author string
Content string
Date datastore.Time
Votes* []Vote
}