【问题标题】:Doing a "IN Array" query on google app engine datastore with golang使用 golang 对谷歌应用引擎数据存储进行“IN Array”查询
【发布时间】:2015-05-25 23:40:39
【问题描述】:

有没有办法在数据存储上使用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
}

【问题讨论】:

  • 我觉得你应该看看testu的回答here

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


【解决方案1】:

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

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

您可以做的是对要过滤的数组中的每个元素执行 单独 查询。此外,如果元素在连续范围内,您可以将IN 替换为id&gt;=minid&lt;=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。

【讨论】:

  • 使用 GQL,您还可以执行类似 SELECT * FROM 调查 WHERE survey.candidate.emails contains ''
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 2013-05-17
  • 2011-02-10
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
相关资源
最近更新 更多