python-确定数据集中是否存在一组键的最佳方法
作者:互联网
我已经预先计算了几百个相同模型的密钥:
candidate_keys = [db.Key(...), db.Key(...), db.Key(...), ...]
其中一些键引用数据存储中的实际实体,而有些则不.我想确定哪些键确实对应于实体.
不必知道实体中的数据,只需知道它们是否存在即可.
一种解决方案是使用db.get():
keys_with_entities = set()
for entity in db.get(candidate_keys):
if entity:
keys_with_entities.add(entity.key())
但是,此过程将从存储中获取所有实体数据,这是不必要且昂贵的.
第二个想法是对key_name使用带有IN过滤器的查询,以30个块为单位手动获取以符合IN伪过滤器的要求.但是,IN过滤器不允许仅键查询.
有没有更好的办法?
解决方法:
App Engine数据存储区不直接支持IN过滤器;它们是在客户端库中实现的一种便利.包含30个值的IN查询将转换为每个值对应30个相等查询,从而产生30个常规查询!
由于往返时间以及什至仅键查询的开销,我怀疑您会发现,仅尝试一次批量获取所有实体是最有效的.但是,如果实体很大,则可以进行进一步的优化:对于插入的每个实体,请插入一个空的“存在”实体作为该实体的子代,并在查询中使用它.例如:
foo = AnEntity(...)
foo.put()
presence = PresenceEntity(key_name='x', parent=foo)
presence.put()
...
def exists(keys):
test_keys = [db.Key.from_path('PresenceEntity', 'x', parent=x) for x in keys)
return [x is not None for x in db.get(test_keys)]
标签:google-app-engine,google-cloud-datastore,python 来源: https://codeday.me/bug/20191210/2101745.html