Performance Google数据存储使用urlsafe批量检索数据

Performance Google数据存储使用urlsafe批量检索数据,performance,google-app-engine,google-cloud-datastore,datastore,Performance,Google App Engine,Google Cloud Datastore,Datastore,Google数据存储中有没有一种方法可以使用urlsafe键值批量获取实体 我知道ndb.get_multi([list]),它获取密钥列表并批量检索实体,效率更高。但在我们的例子中,我们有一个包含数百个实体的网页,其中嵌入了实体urlsafe键值。起初,我们只在单个实体上执行操作,因此我们能够使用urlsafe值检索实体并轻松地执行操作。现在,我们需要一次改变多个实体,一个接一个的循环听起来并不是一种有效的方法。有什么想法吗 直接使用实体密钥ID(相对于密钥urlsafe值)有什么好处吗get

Google数据存储中有没有一种方法可以使用urlsafe键值批量获取实体

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

直接使用实体密钥ID(相对于密钥urlsafe值)有什么好处吗<中的code>get_by_id()并不意味着能够批量获取实体(只需要一个id)


如果批量检索实体的唯一方法是使用entities键,但在网页上公开该键并不是推荐的方法,这是否意味着在一个包含数百个实体的页面上进行批量操作时,我们会陷入困境?

键和urlsafe字符串完全处于1:1关系。如果您有一个,您可以获得另一个:

urlsafe_string = entity_key.urlsafe()
entity_key = ndb.Key(urlsafe=urlsafe_string)
entity_key_id = entity_key.id()
entity_key = ndb.Key(MyModel, entity_key_id)
因此,如果您有一组urlsafe字符串,您可以获取相应的键,然后使用
ndb。使用这些键获取所有实体,根据需要修改它们,然后使用
ndb。将它们放回数据存储中

至于使用ID——这只有在不使用实体祖先的情况下才有效(以一种方便的方式)。否则,要获取密钥,您需要ID和实体的父密钥(或其整个祖先)-这并不方便,最好在这种情况下使用urlsafe字符串

但对于没有父实体(即各实体组中的根实体)的实体,实体键及其ID始终处于1:1的关系中,如果您有另一个,您也可以获得一个:

urlsafe_string = entity_key.urlsafe()
entity_key = ndb.Key(urlsafe=urlsafe_string)
entity_key_id = entity_key.id()
entity_key = ndb.Key(MyModel, entity_key_id)
因此,同样可以从一组ID中获取用于
ndb.get\u multi()
和/或
ndb.put\u multi()
的密钥

与urlsafe字符串相比,使用ID有一个表面上的优势——通常在URL或页面HTML代码中使用ID时更短、更容易看到:)

使用ID的另一个优点是能够拆分大型实体,或者以更简单的方式处理1:1关系中的实体。看


有关密钥和ID的更多信息,请参阅。

非常感谢@Dan Cornilescu的解释,因此您要说的是,在urlsafe列表上循环并使用
entity\u key=ndb.key(urlsafe=urlsafe\u string)
将不会访问数据存储,这基本上是一个ndb类函数,用于将urlsafe转换(解码)为密钥?之后可以使用
ndb.get_multi()
,对吗?太棒了,谢谢。我试过了,结果很好。另一个挑战出现了,因为我尝试使用异步版本
ndb.get\u multi\u async()
,它返回一个未来列表而不是一个单一的,并且
get\u result()
对列表不起作用。我不想在列表上循环,但要想弄明白这一点:D..无论如何,你必须得到结果-我猜你使用
get\u multi*
,因为你想要实体值。这只是
entities=[future,get_result()for future in future\u list]
,我不认为这是一个问题……是的,对于值,我尝试使用异步来获得更好的用户体验,所以使用非阻塞数据存储调用。虽然我不认为这在代码的特定部分是一个主要问题,因为在我需要调用结果之前没有发生太多的事情。我们只是在寻找一种批量检索值的方法,而不是循环,一点性能问题—您正在批量检索它们。
.get_result()
循环只确保接收所有未来的结果。异步操作是正常的。