Python 检查数据存储表中是否存在指定的多个键而不提取实体

Python 检查数据存储表中是否存在指定的多个键而不提取实体,python,google-app-engine,google-cloud-datastore,google-app-engine-python,Python,Google App Engine,Google Cloud Datastore,Google App Engine Python,比如说,我有1000个关键名称,我想在Google App Engine数据存储中检查它们的存在,但不需要获取实体本身。除了可能的加速之外,原因之一是仅获取密钥是免费的(无成本) ndb.get_multi()允许我传入键列表,但它将检索实体。我需要一个函数来实现这一点,但不获取实体,而是根据指定的键是否存在而执行True或False。我可能会使用仅键查询…: q = EntityKind.query(EntityKind.key.IN(wanted_keys)) keys_present =

比如说,我有1000个关键名称,我想在Google App Engine数据存储中检查它们的存在,但不需要获取实体本身。除了可能的加速之外,原因之一是仅获取密钥是免费的(无成本)


ndb.get_multi()
允许我传入键列表,但它将检索实体。我需要一个函数来实现这一点,但不获取实体,而是根据指定的键是否存在而执行
True
False

我可能会使用仅键查询…:

q = EntityKind.query(EntityKind.key.IN(wanted_keys))
keys_present = set(q.iter(keys_only=True))
这将为您提供
keys\u present
,作为
所需密钥中的一组密钥,实际存在于数据存储中。与所需的从键到布尔的映射不完全相同,但后者可以轻松构建:

key_there = {k: (k in keys_present) for k in wanted_keys}

…如果您确实想要它(对于
集合
!-)而言,具有
bool
值的
dict
通常更可能是一个不太易使用的黑客。

此解决方案将导致多达1000个单独的查询,因为in操作符只是列表中每个成员的EQUAL的快捷方式。我怀疑它可能会非常慢。@AndreiVolgin,是的,我知道如何实现
中的
(在SDK的ndb源代码中非常可读,对吗?-)——但是,那些按键的基础查询尽可能地优化,对于足够大的实体,我会打赌这些加上仅键约束,以超越任何其他方法(最好总是在您自己的实体和应用程序上进行测量!-)。我尝试了1513个键:(1)使用上面的key.IN,需要20秒。(2)使用key.IN,但分块到100个键,使用fetch_async,需要15秒。(3)使用get_multi(不是免费的),需要4.6秒。哦,不!!!这是一个坏主意,正如@AndreiVolgin所说:你正在激发尽可能多的查询,就像你找到了答案一样…没有比只做ndb更快的方法了。get_multi()