目前无法请求实体属性的子集。当您拥有所需的密钥列表时,您应该使用get_multi()。
投影查询背景
在 Datastore 中,投影查询只是索引扫描。
例如,假设您正在编写查询SELECT * FROM MyKind ORDER BY myFirstProp, mySecondProp。此查询将针对索引执行:Index(MyKind, myFirstProp, mySecondProp)。该索引可能类似于:
myFirstProp | mySecondProp | __key__
------------------------------------
a 1 k1
a 2 k2
b 1 k3
对于索引中的每个结果,Datastore 会查找与该索引结果关联的键。如果您执行投影查询时仅投影 myFirstProp 或 mySecondProp 或两者,Datastore 可以避免执行随机访问查找来查找每个结果的关联实体。这通常是您通过使用预测获得巨大性能提升的地方 - 而不是通过网络传输它的节省。
同样,如果你知道你需要的键列表,你可以直接查找键——不需要先在索引中查找。
IN 运算符
在 Python GQL (not in the similar Cloud Datastore GQL) 中,有 IN 运算符,它允许您编写如下查询:
SELECT * FROM MyKind WHERE myFirstProp IN ['a', 'b'].
但是,Datastore 实际上并不本机支持此查询。在 python 客户端中,这将被转换为disjunctive normal form:
SELECT * FROM MyKind WHERE myFirstProp = 'a'
UNION
SELECT * FROM MyKind WHERE myFirstProp = 'b'
这意味着对于 IN 中的每个值,您将发出单独的数据存储区查询。