Google Datastore 使用 urlsafe 批量检索数据

Google Datastore bulk retrieve data using urlsafe

Google DataStore 中是否有一种方法可以使用其 urlsafe 键值批量获取实体?

我知道 ndb.get_multi([list]),它采用键列表并批量检索实体,这样效率更高。但在我们的例子中,我们有一个包含数百个实体的网页,这些实体嵌入了实体 urlsafe 键值。起初我们只是对单个实体进行操作,所以我们可以使用 urlsafe 值来检索实体并进行操作,而不会有太多麻烦。现在,我们需要一次更改多个实体,一个一个地循环它们听起来不像是一种有效的方法。有什么想法吗?

直接使用实体密钥 ID(相对于密钥 urlsafe 值)有什么优势吗? documentation中的get_by_id()并不意味着能够批量获取实体(只需要一个ID)。

如果批量检索实体的唯一方法是使用实​​体键,但不推荐在网页上公开该键,这是否意味着我们在页面上进行批量操作时遇到困难有几百个实体?

键和 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() and/or ndb.put_multi() 的密钥。

与 urlsafe 字符串相比,使用 ID 具有美观的优势 - 当它们出现在 URL 或页面 HTML 代码中时,它们通常更短且更容易在眼睛上看到:)

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

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