Appengine>执行>映射数据存储区结果

我正在尝试映射由query.GetAll()获取的结果


我需要映射结果,因为模板将需要与每个实体相关联的数据存储区“ Key”。


目前,我正在执行以下操作:


// Query

q := datastore.NewQuery("Article").Limit(10)

// Define array where the entities will be retreived

var a[] Article;

// Retreive entities

key, _ := q.GetAll(c, &a)

// Create an empty map

article := map[string] Article{}

// Build the map

for k := range a {

    article[key[k].Encode()] = a[k];

}

template.Execute(w, map[string]interface{} { "Articles" : article})

有没有更有效的方法直接使用query.GetAll()来构建地图,因为创建数组,映射并在数组上循环以构建地图似乎并不明智?


还是一种更有效的方式来获取与每个实体相关联的数据存储区密钥(已编码)?


红颜莎娜
浏览 215回答 3
3回答

慕后森

我认为您不需要地图。据我了解,在GetAll之后,您有两个平行的片,键和a。(我不知道GAE,但是_引起了我的注意。您应该检查一下吗?)模板可以处理并行数组。在文档中查看range操作如何返回两个结果,即value和and index。您应该能够跨一个切片,并使用索引从另一个切片中获取相应的值。这将是一个更复杂的模板,但应该让您避开地图。编辑:对不起,我以为我知道该怎么做,但是在尝试编写示例时失败了。如果有人知道如何做,我将其留在这里,否则,请投票...

翻阅古今

也许您可以将嵌入到Key中Article。您仍然必须遍历文章和键,但至少不必创建单独的地图。type Article struct {    // Add a key to the struct, but prevent it from being saved to the datastore.    Key datastore.Key `datastore:"-"`}// Queryq := datastore.NewQuery("Article").Limit(10)// Define array where the entities will be retreivedvar a[] Article// Retreive entitieskey, _ := q.GetAll(c, &a)// Loop through the articles adding the key as you go.for i := range a {    a[i].Key = key[i]}template.Execute(w, map[string]interface{} { "Articles" : a})然后在您的模板中,您将调用 article.Key.Encode
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go