英文:
Golang - Appengine datastore filter query with []byte comparison
问题
我正在尝试在数据存储中对一组实体执行过滤查询,但我要查询的实体字段是 []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 类型的字段上使用比较过滤器进行查询?
英文:
I am trying to perform a filter query on a set of entities in the datastore, but the entity field I am trying to query against, with the equality operator, is of type []byte and I don't know if appengine datastore can perform this comparison
This is my entity:
type Data struct {
Id int64 `json:"id"`
Version int32 `json:"-"`
HMAC []byte `json:"-"`
Status string `json:"status"`
}
And here is my query logic
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
}
It builds but does not return any results, even after programmatically retrying over the course of 10 seconds so i do not believe it is an issue of eventual consistency between the datastore and the view data that I've stored there.
My main question is: does the appengine datastore allow for a query to use a comparison filter on a field with type []byte?
答案1
得分: 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
英文:
In 1.9.11, the ByteString
type was introduced to the datastore package. It can be used for storing short, indexed byte slices.
If you change your entity to the following, it should work:
type Data struct {
ID int64 `json:"id"`
Version int32 `json:"-"`
HMAC datastore.ByteString `json:"-"`
Status string `json:"status"`
}
More info: https://developers.google.com/appengine/docs/go/datastore/entities#Go_Properties_and_value_types
答案2
得分: 3
你的主要问题的答案是否定的,因为[]byte被存储为blob,而blob在应用引擎数据存储中不被索引。
在具有筛选器或排序顺序的查询中,无法匹配该实体。
注意:除了你明确声明的任何未索引属性外,类型为[]byte的属性也会自动被视为未索引。
这是文档链接:https://developers.google.com/appengine/docs/go/datastore/indexes#Go_Unindexed_properties
英文:
The answer to your main question is No, because []byte is stored as blob, which is not indexed by the app engine datastore.
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.
Here is the documentation: https://developers.google.com/appengine/docs/go/datastore/indexes#Go_Unindexed_properties
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论