Google DataStore 中是否有一种方法可以使用 urlsafe 键值批量获取实体?
我知道
ndb.get_multi([list])
它采用键列表并批量检索实体,这更有效。但在我们的例子中,我们有一个包含数百个实体的网页,其中嵌入了实体 urlsafe 键值。起初我们只对单个实体进行操作,因此我们能够使用 urlsafe 值来检索实体并轻松执行操作。现在,我们需要一次更改多个实体,并且一个一个地循环它们听起来不是一种有效的方法。有什么想法吗?
直接使用实体密钥 ID(相对于密钥 urlsafe 值)有什么优势吗?
文档中的
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()
和/或 ndb.put_multi()
一起使用的密钥。
使用 ID 比 urlsafe 字符串具有外观上的优势 - 当它们出现在 URL 或页面 HTML 代码中时,通常更短、更容易被眼睛看到:)
使用 ID 的另一个优点是能够拆分大型实体或以更简单的方式处理 1:1 关系中的实体。请参阅将实体的 ID 重新用于不同类型的其他实体 - 明智的想法吗?
有关密钥和 ID 的更多信息,请参阅创建和使用实体密钥。