使用AppEngine appstats我查询了我的查询,并注意到尽管文档说查询花费一次读取,使用ndb.OR(或扩展为OR的.IN)的查询,花费n读取(n等于OR子句的数量) )。
例如:
votes = (Vote.query(ndb.OR(Vote.object == keys[0], Vote.object == keys[1]))
.filter(Vote.user_id == user_id)
.fetch(keys_only=True))
此查询需要2次读取(它匹配0个实体)。如果我用Vote.object.IN替换ndb.OR,则读取次数等于我传递给读取的数组的长度。
这种行为与文档相矛盾。
我想知道是否有其他人经历过同样的事情,如果这是AE,docs或我的理解中的错误。
感谢。
答案 0 :(得分:2)
ndb的查询文档并不是特别明确,但这段是你最好的答案
除了本机运算符之外,API还支持!=运算符, 使用布尔OR运算和IN组合滤波器组 操作,测试与可能值列表之一的相等性 (比如Python'在'运算符中)。这些操作不会将1:1映射到 数据存储的本地操作;因此它们有点古怪而缓慢, 相对。它们是使用结果的内存中合并实现的 流。注意,p!= v实现为" p< v OR p> V&#34 ;. (这个 重复财产的问题。)
在此文档中https://developers.google.com/appengine/docs/python/ndb/queries