小编典典

使用golang在Google App Engine数据存储上执行“ IN Array”查询

go

有没有一种方法可以ids []int64对数据存储区进行查询?我尝试了以下无济于事。

  1. 错误出

    q := datastore.NewQuery("Category").Filter("Id IN", ids)
    
  2. 让我了解数据存储区中的所有类别

    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
}

阅读 214

收藏
2020-07-02

共1个答案

小编典典

通常"IN",数据存储区不支持过滤器。Query.Filter()清单文档列出了允许的运算符:

">", "<", ">=", "<=", or "="

您可以为要作为过滤依据的数组中的每个元素执行一个 单独的
查询。同样,如果元素在连续范围内,则可以INid>=min和代替id<=max。例如:

ids := []int64{1,2,3,4}
q := datastore.NewQuery("Category").Filter("Id>=", 1).Filter("Id<=", 4)

还要注意,虽然IN通常不支持,但是如果属性是实体键本身,则可以使用datastore.GetMulti()函数获取由其键数组指定的实体列表:

func GetMulti(c appengine.Context, key []*Key, dst interface{}) error

注意:

第二次尝试返回所有实体,因为您调用Filter()了查询,但是没有存储返回值,因此最终执行的查询将根本没有任何过滤器。Query.Filter()返回包含您刚刚指定的过滤器的派生查询,您必须使用返回的Query进行中查询。所以应该是:

q = q.Filter("Id=", id)

但是,即使这样也不起作用:如果指定了多个过滤器,它们将处于逻辑AND连接,因此很可能会给您0结果,因为我怀疑在Id列表和包含您所有ID的类别中都不会存在想要过滤。

2020-07-02