当一个对象需要另一个对象的键时批量写入
Bulk writes when one object requires the Key of another
正在想办法解决这个问题。使用 Python 和 NDB 库。
我想创建一个实体,并且该实体还绑定到另一个实体。两者是同时创建的。示例是为大量用户创建消息。我们有一个 Inbox
table/kind 和一个 Message
table.
因此,一旦我们收集了我们想要的所有用户的密钥,我所做的就是创建 Inbox
实体,保存它,然后使用它 returns 提供的密钥并附加到 Message
,然后保存 Message
。对于大量用户来说,这似乎相当昂贵。每个用户 2 次写入。通常我会自己创建对象,然后使用 ndb.put_multi()
来批量写入。因为在保存之前没有Key
,所以我不能这样做。
希望这是有道理的。想法?
看看 allocate_ids API。您可以传递父键并分配 id。 allocate_ids 调用保证 id 永远不会在该父键上下文中重复使用。 allocate_ids 是一个小操作而且速度很快。分配这些 ID 后,您可以通过在引用它们的其他实体中引用分配的 ID 来执行 put_multi。据我所知,消息实体本身没有被引用,如果是这样,您只需要为收件箱分配 ID(大概如果用户已经没有)并在收件箱和消息实体上执行 multi_put。
正在想办法解决这个问题。使用 Python 和 NDB 库。
我想创建一个实体,并且该实体还绑定到另一个实体。两者是同时创建的。示例是为大量用户创建消息。我们有一个 Inbox
table/kind 和一个 Message
table.
因此,一旦我们收集了我们想要的所有用户的密钥,我所做的就是创建 Inbox
实体,保存它,然后使用它 returns 提供的密钥并附加到 Message
,然后保存 Message
。对于大量用户来说,这似乎相当昂贵。每个用户 2 次写入。通常我会自己创建对象,然后使用 ndb.put_multi()
来批量写入。因为在保存之前没有Key
,所以我不能这样做。
希望这是有道理的。想法?
看看 allocate_ids API。您可以传递父键并分配 id。 allocate_ids 调用保证 id 永远不会在该父键上下文中重复使用。 allocate_ids 是一个小操作而且速度很快。分配这些 ID 后,您可以通过在引用它们的其他实体中引用分配的 ID 来执行 put_multi。据我所知,消息实体本身没有被引用,如果是这样,您只需要为收件箱分配 ID(大概如果用户已经没有)并在收件箱和消息实体上执行 multi_put。