Repository navigation
How can I create a partial key where the parent uses an ID identifier in Datastore #567
Description
Activity
var key = dataset.key(['Entry', 1234, 'ChildEntryKind']);
should do what you want, right?
- addedtype: questionRequest for information or clarification. Not an issue.Request for information or clarification. Not an issue.api: datastoreIssues related to the Datastore API.Issues related to the Datastore API.
on May 8, 2015 I was looking for an automatically generated numeric ID. The same way the key will produce something like 5657382461898752 for the ChildEntryKind. I don't want to stick in 1234 for every parent Entry.
If you want an auto-generated ID for the parent, you would have to save it first, and then use that auto-generated ID. There is currently no way to create both a parent and a child in a single request where both have auto-generated IDs. That is, you can't make a single request to do the equivalent of this:
var key = dataset.key(['ParentKind', <auto-generated-id>, 'ChildEntityKind']);
You can, however, create a child with a non-existent parent, if you choose the name of the parent. That is, if you create the following key, you'll create an entity of Kind
ChildEntityKindwith an automatically generated ID, which is a child of the non-existent entity{kind: 'ParentKind', keyName: 'parent-entity-key'}:var key = dataset.key(['ParentKind', 'parent-entity-key', 'ChildEntityKind']);
I don't believe there's anything else our library can do, since we're limited by:
There is currently no way to create both a parent and a child in a single request where both have auto-generated IDs.
@jgeewax is it worth keeping this issue open to track when that feature launches, or is it not something that's being worked on?
Technically, there a few options here:
-
Pick the key names for both keys. Then you're all set.
-
Pick a parent key (number or name), and then auto-generate the child key. It's best to try to pick something uniformly distributed (maybe a random base-64 string? or a random number between 1 and ). Then you could always do:
var key = dataset.key(['ParentKind', <random string or integer>, 'ChildKind']);
-
Use the
allocateIdsAPI method (I don't know if we support that...?) to get a randomly generated ID, and then use that. Then you could do this in a single transaction:var firstKey = <allocateIds for a ParentKind key>; var childKey = <allocateIds for a ChildKind key, parent = previous key>; dataset.runInTransaction(function() { <save both entities at once>; });
Obviously this means you have to make 3 separate API calls rather than one, but the important one is in a transaction (if that's what you're looking for).
Keep in mind that the child can exist without the parent -- so the key
ParentKind:1234/ChildKind:5678doesn't requireParentKind:1234to exist at all.@stephenplusplus: Do we support allocating IDs at all using gcloud-node?
-
I think we've gone over all of the options here, and we currently support solutions 1-3 mentioned above. Please re-open if there's more we can do.
- added a commit that references this issue
on Sep 15, 2022 15 remaining items
- added a commit that references this issue
on Jan 28, 2026 - added a commit that references this issue
on Feb 5, 2026 - added a commit that references this issue
on Feb 17, 2026 - added a commit that references this issue
on Feb 23, 2026 - added a commit that references this issue
on Feb 25, 2026 - added a commit that references this issue
on Mar 18, 2026
I know to create a partial key I can write
how can I write a partial key with a parent without specifying name ? For example
creates a partial key with a parent, but the parent key has an identifier name='foot'. How can I state that the parent should use a numeric id (or am I misunderstanding this) ?