Google Datastore使用urlsafe批量检索数据

时间:2017-12-08 19:30:06

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

Google DataStore中是否有办法使用其urlsafe密钥值批量获取实体?

我知道ndb.get_multi([list])获取密钥列表并批量检索实体,效率更高。但在我们的例子中,我们有一个包含几百个实体的网页,其中嵌入了实体urlsafe键值。起初我们只对单个实体进行操作,因此我们能够使用urlsafe值来检索实体并执行操作而不会有太多麻烦。现在,我们需要一次更改多个实体,并逐个循环它们听起来不是一种有效的方法。有什么想法吗?

直接使用实体密钥ID(与密钥urlsafe值)是否有任何优势? documentation中的get_by_id()并不意味着能够批量获取实体(只需一个ID)。

如果批量检索实体的唯一方法是使用实​​体密钥,但是,在网页上公开密钥不是推荐的方法,这是否意味着当涉及到具有分页的页面上的批量操作时,我们会陷入困境几百个实体?

1 个答案:

答案 0 :(得分:1)

密钥和urlsafe字符串完全采用1:1的关系。如果你有一个,你可以获得另一个:

urlsafe_string = entity_key.urlsafe()
entity_key = ndb.Key(urlsafe=urlsafe_string)

因此,如果您有一堆urlsafe字符串,则可以获取相应的键,然后使用ndb.get_multi()使用这些键获取所有实体,根据需要修改它们,然后使用ndb.put_multi()将它们保存回数据存储区。

至于使用ID - 如果你不使用实体祖先,那只能(以方便的方式)。否则,为了获得密钥,您需要ID和实体的父密钥(或其整个祖先) - 它不方便,在这种情况下更好地使用urlsafe字符串。

但是对于没有父母的实体(在各个实体组中也称为根实体),实体密钥及其ID始终保持1:1的关系,如果您拥有另一个,则可以再获得一个:

entity_key_id = entity_key.id()
entity_key = ndb.Key(MyModel, entity_key_id)

再次从一堆ID中,您可以获得与ndb.get_multi()和/或ndb.put_multi()一起使用的密钥。

使用ID可以比urlsafe字符串具有美观优势 - 当它们出现在URL或页面HTML代码中时,通常会更简单,更容易:>

使用ID的另一个好处是能够拆分大型实体或以1:1的关系以更简单的方式处理实体。见re-using an entity's ID for other entities of different kinds - sane idea?

有关密钥和ID的更多信息,请参阅Creating and Using Entity Keys