【发布时间】:2015-10-07 19:33:14
【问题描述】:
我正在使用 Go 和 Google Datastore 在 Google App Engine 中构建目录应用程序。我正在使用数据存储区的Ancestor 功能来管理不同的产品类别。以下是一些数据的示例:
Musical Instruments -> Guitars -> Gibson -> Les Paul
Musical Instruments -> Guitars -> Fender -> Stratocaster
Musical Instruments -> Bass Guitars -> Music Man -> Stingray
Musical Instruments 是根实体。当我单击它时,我希望看到Guitars 和Bass Guitars,但相反,我看到的所有内容都是Musical Instruments 的后代,一直到最后一个实体。这不是我要找的。目前我只对乐器的直系后代感兴趣。
like this one 的一些帖子建议在数据存储区中创建一个字段来跟踪直接父母。但是,如果我要手动跟踪父实体,为什么要使用 Ancestor 功能呢?它会比过滤匹配直接父字段的查询更快吗?
获取类别的方法如下:
func (cat *Category) GetCategories(r *http.Request, pk string) ([]CategoryReturn, error) {
//get context
c := appengine.NewContext(r)
var q *datastore.Query
var err error
//get parent key
k, err := datastore.DecodeKey(pk)
if err != nil {
//handle error
return []CategoryReturn{}, err
}
q = datastore.NewQuery("Category").Ancestor(k)
//populate category slices
var categories []CategoryReturn
keys, err := q.GetAll(c, &categories)
if err != nil {
//handle error
return []CategoryReturn{}, err
}
//create return object
results := make([]CategoryReturn, 0, 20)
for i, r := range categories {
k := keys[i]
y := CategoryReturn {
Name: r.Name,
Id: k.IntID(),
Key: k.Encode(),
}
results = append(results, y)
}
return results, nil
}
【问题讨论】:
-
你能发布你的代码来显示你的祖先查询吗?我的预感是您可能不想以这种方式使用祖先,因为它们会影响您对所有乐器的写入速率。您是否需要整个乐器实体组的强一致性?
-
增加了获取类别的方法。对于应用程序的这个特定部分,我不需要强一致性。
标签: google-app-engine go google-cloud-datastore