Skip to content

How can I create a partial key where the parent uses an ID identifier in Datastore #567

Description

@byrneciaran

I know to create a partial key I can write

var key = ds.key(['Entry']);

how can I write a partial key with a parent without specifying name ? For example

var key = ds.key(['Entry', 'Foo', 'Todo']);

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) ?

Activity

  1. jgeewax commented on May 8, 2015

    @jgeewax
    Contributor
    var key = dataset.key(['Entry', 1234, 'ChildEntryKind']);

    should do what you want, right?

  2. added
    type: questionRequest for information or clarification. Not an issue.
    api: datastoreIssues related to the Datastore API.
    on May 8, 2015
  3. byrneciaran commented on May 8, 2015

    @byrneciaran
    Author

    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.

  4. jgeewax commented on May 8, 2015

    @jgeewax
    Contributor

    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 ChildEntityKind with 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']);
  5. stephenplusplus commented on Jun 4, 2015

    @stephenplusplus
    Contributor

    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?

  6. jgeewax commented on Jun 4, 2015

    @jgeewax
    Contributor

    Technically, there a few options here:

    1. Pick the key names for both keys. Then you're all set.

    2. 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']);
    3. Use the allocateIds API 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:5678 doesn't require ParentKind:1234 to exist at all.

    @stephenplusplus: Do we support allocating IDs at all using gcloud-node?

  7. stephenplusplus commented on Nov 23, 2015

    @stephenplusplus
    Contributor

    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.

  8. 15 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

api: datastoreIssues related to the Datastore API.type: questionRequest for information or clarification. Not an issue.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions