有没有一种方法可以ids []int64对数据存储区进行查询?我尝试了以下无济于事。
ids []int64
错误出
q := datastore.NewQuery("Category").Filter("Id IN", ids)
让我了解数据存储区中的所有类别
for _, id := range ids { q.Filter("Id =", id)
}
在icza回答之后
var keys []*datastore.Key for _, id := range ids { keys = append(keys, datastore.NewKey(c, "Category", "", id, nil)) } categories := make([]Category, len(keys)) err := datastore.GetMulti(c, keys, categories) if err != nil { return nil, err }
通常"IN",数据存储区不支持过滤器。Query.Filter()清单文档列出了允许的运算符:
"IN"
Query.Filter()
">", "<", ">=", "<=", or "="
您可以为要作为过滤依据的数组中的每个元素执行一个 单独的 查询。同样,如果元素在连续范围内,则可以IN用id>=min和代替id<=max。例如:
IN
id>=min
id<=max
ids := []int64{1,2,3,4} q := datastore.NewQuery("Category").Filter("Id>=", 1).Filter("Id<=", 4)
还要注意,虽然IN通常不支持,但是如果属性是实体键本身,则可以使用datastore.GetMulti()函数获取由其键数组指定的实体列表:
datastore.GetMulti()
func GetMulti(c appengine.Context, key []*Key, dst interface{}) error
注意:
第二次尝试返回所有实体,因为您调用Filter()了查询,但是没有存储返回值,因此最终执行的查询将根本没有任何过滤器。Query.Filter()返回包含您刚刚指定的过滤器的派生查询,您必须使用返回的Query进行中查询。所以应该是:
Filter()
Query
q = q.Filter("Id=", id)
但是,即使这样也不起作用:如果指定了多个过滤器,它们将处于逻辑AND连接,因此很可能会给您0结果,因为我怀疑在Id列表和包含您所有ID的类别中都不会存在想要过滤。
Id