做一个" IN数组"使用golang在google app引擎数据存储区中查询

时间:2015-03-23 02:39:37

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

有没有办法在数据存储区中使用ids []int64进行查询?我试过以下但没有用。

  1. 错误

    q := datastore.NewQuery("Category").Filter("Id IN", ids)
    
  2. 只需获取数据存储区中的所有类别

    for _, id := range ids {
        q.Filter("Id =", id)
    }
    
  3. 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
    }
    

1 个答案:

答案 0 :(得分:5)

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

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

您可以执行的是对要过滤的数组中的每个元素执行单独的查询。此外,如果元素处于连续范围内,您可以将IN替换为id>=minid<=max。 E.g:

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。