Appengine>去>映射数据存储结果

时间:2012-04-30 00:04:50

标签: google-app-engine map go datastore

我正在尝试映射query.GetAll()

检索到的结果

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

目前我正在做以下事情:

// 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()构建地图,因为创建数组,数组上的地图和循环以构建地图似乎不明智?

或者更有效的方法来获取与每个实体关联的数据存储区密钥(编码)?

3 个答案:

答案 0 :(得分:1)

也许最好是将切片压缩成单个切片。沿着这些路线,

package main

import (
    "os"
    "text/template"
)

type pair struct {
    Key     string
    Article string
}

var tmpt = `Here's the list:{{range $p := .}}
    {{$p.Key}}: {{$p.Article}}{{end}}
`

func main() {
    list := template.Must(template.New("list").Parse(tmpt))
    // query
    key := []string{"banana", "donkey", "curious"}
    a := []string{"long fruit", "who needs one?", "human nature"}
    // zip
    pairs := make([]pair, len(key))
    for i, k := range key {
        pairs[i].Key = k
        pairs[i].Article = a[i]
    }
    // execute on zipped list
    if err := list.Execute(os.Stdout, pairs); err != nil {
        os.Stdout.WriteString(err.Error())
    }
}

输出:

Here's the list:
        banana: long fruit
        donkey: who needs one?
        curious: human nature

答案 1 :(得分:0)

我认为你不需要地图。如果我理解,在GetAll之后,你有两个平行切片,key和a。 (我不知道GAE,但_引起了我的注意。你应该检查一下吗?)模板可以处理并行数组。请参阅doc文档中的范围操作如何返回两个结果,一个值和索引。您应该能够覆盖一个切片并使用索引从另一个切片获取相应的值。它将是一个更复杂的模板,但应该让你避免使用地图。

编辑:对不起,我以为我知道怎么做,但是在我尝试编写示例代码时失败了。我会把它留在这里以防其他人知道如何做到这一点,否则,downvote ......

答案 2 :(得分:0)

也许您可以在Key中嵌入Article。你仍然需要遍历文章和键,但至少你不必创建一个单独的地图。

type Article struct {
    // Add a key to the struct, but prevent it from being saved to the datastore.
    Key datastore.Key `datastore:"-"`
}

// 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)

// 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