Golang - 使用[]字节比较的Appengine数据存储过滤器查询

时间:2014-09-14 01:08:06

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

我正在尝试对数据存储区中的一组实体执行过滤器查询,但我尝试使用等于运算符查询的实体字段的类型为[] byte,我不知道是否有appengine数据存储区可以执行此比较

这是我的实体:

type Data struct {
 Id          int64  `json:"id"`
 Version     int32  `json:"-"`
 HMAC        []byte `json:"-"`
 Status      string `json:"status"`
}

这是我的查询逻辑

func (view *DataView) GetDataByHMAC(hmac []byte) (Data, error) {
    view_key := datastore.NewKey(view.context, "View", "data-view", 0, nil)
    data := make([]Data, 0)
    query := datastore.
       NewQuery("ViewData").
       Ancestor(view_key).
       Filter("HMAC = ", hmac)
    _, err := query.GetAll(view.context, &data)
    if err != nil {
       return Data{}, err
    }
    if len(data) == 0 {
       return Data{}, ErrNoData
    }
    return data[0], nil
}

它构建但不返回任何结果,即使在10秒的过程中以编程方式重试,因此我不认为这是数据存储区与我存储在那里的视图数据之间的最终一致性问题。

我的主要问题是:appengine数据存储区是否允许查询在类型为[] byte的字段上使用比较过滤器?

2 个答案:

答案 0 :(得分:4)

在1.9.11中,ByteString类型被引入数据存储区包。它可用于存储短的索引字节片。

如果您将实体更改为以下内容,则应该有效:

type Data struct {
  ID      int64                `json:"id"`
  Version int32                `json:"-"`
  HMAC    datastore.ByteString `json:"-"`
  Status  string               `json:"status"`
}

更多信息:https://developers.google.com/appengine/docs/go/datastore/entities#Go_Properties_and_value_types

答案 1 :(得分:3)

您的主要问题的答案是否,因为[]字节存储为blob,而不是应用引擎数据存储区索引。

queries with a filter or sort order on the unindexed property 
will never match that entity.
Note: In addition to any unindexed properties you declare explicitly, 
those typed as []byte are automatically treated as unindexed.

以下是文档:https://developers.google.com/appengine/docs/go/datastore/indexes#Go_Unindexed_properties