Datastore

Datastore

Idiomatic class for interacting with Cloud Datastore. Uses the lower-level DatastoreClient class under the hood.

In addition to the constructor options shown here, the Datastore class constructor accepts the same options accepted by DatastoreClient.

The Datastore Emulator

Make sure you have the gcloud SDK installed, then run:

  $ gcloud beta emulators datastore start --no-legacy

You will see the following printed:

  [datastore] API endpoint: http://localhost:8005
  [datastore] If you are using a library that supports the
              DATASTORE_EMULATOR_HOST environment variable, run:
  [datastore]
  [datastore]   export DATASTORE_EMULATOR_HOST=localhost:8005
  [datastore]
  [datastore] Dev App Server is now running.

Set that environment variable and your localhost Datastore will automatically be used. You can also pass this address in manually with apiEndpoint.

Additionally, DATASTORE_PROJECT_ID is recognized. If you have this set, you don't need to provide a projectId.

See Cloud Datastore Concepts Overview

Constructor

new Datastore(optionsopt)

Parameters:
Name Type Attributes Description
options object <optional>

Configuration options.

Properties
Name Type Attributes Description
apiEndpoint string <optional>

Override the default API endpoint used to reach Datastore. This is useful for connecting to your local Datastore server (usually "http://localhost:8080").

namespace string <optional>

Namespace to isolate transactions to.

Examples
Import the client library
```
const {Datastore} = require('@google-cloud/datastore');

```
Create a client that uses <a href="https://cloud.google.com/docs/authentication/production#providing_credentials_to_your_application">Application Default Credentials (ADC)</a>:
```
const datastore = new Datastore();

```
Create a client with <a href="https://cloud.google.com/docs/authentication/production#obtaining_and_providing_service_account_credentials_manually">explicit credentials</a>:
```
const datastore = new Datastore({
  projectId: 'your-project-id',
  keyFilename: '/path/to/keyfile.json'
});

```
Retrieving Records
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();

// Records, called "entities" in Datastore, are retrieved by using a key. The
// key is more than a numeric identifier, it is a complex data structure that
// can be used to model relationships. The simplest key has a string `kind`
// value, and either a numeric `id` value, or a string `name` value.
//
// A single record can be retrieved with Datastore#key and
// Datastore#get.
//-
const key = datastore.key(['Company', 'Google']);

datastore.get(key, function(err, entity) {
  // entity = The record.
  // entity[datastore.KEY] = The key for this entity.
});

//-
// <h3>Querying Records</h3>
//
// Create a query with Datastore#createQuery.
//-
const query = datastore.createQuery('Company');

//-
// Multiple records can be found that match criteria with
// Query#filter.
//-
query.filter('location', 'CA');

//-
// Records can also be ordered with Query#order.
//-
query.order('name');

//-
// The number of records returned can be specified with
// Query#limit.
//-
query.limit(5);

//-
// Records' key structures can also be queried with
// Query#hasAncestor.
//-
const ancestorKey = datastore.key(['ParentCompany', 'Alphabet']);

query.hasAncestor(ancestorKey);

//-
// Run the query with Datastore#runQuery.
//-
datastore.runQuery(query, (err, entities) => {
  // entities = An array of records.

  // Access the Key object for an entity.
  const firstEntityKey = entities[0][datastore.KEY];
});

```
Paginating Records
```
// Imagine building a website that allows a user to sift through hundreds of
// their contacts. You'll likely want to only display a subset of these at
// once, so you set a limit.
//-
const express = require('express');
const app = express();

const NUM_RESULTS_PER_PAGE = 15;

app.get('/contacts', (req, res) => {
  const query = datastore.createQuery('Contacts')
    .limit(NUM_RESULTS_PER_PAGE);

  if (req.query.nextPageCursor) {
    query.start(req.query.nextPageCursor);
  }

  datastore.runQuery(query, (err, entities, info) => {
    if (err) {
      // Error handling omitted.
      return;
    }

    // Respond to the front end with the contacts and the cursoring token
    // from the query we just ran.
    const frontEndResponse = {
      contacts: entities
    };

    // Check if  more results may exist.
    if (info.moreResults !== datastore.NO_MORE_RESULTS) {
      frontEndResponse.nextPageCursor = info.endCursor;
    }

    res.render('contacts', frontEndResponse);
  });
});

```
Creating Records
```
// New entities can be created and persisted with Datastore#save.
// The entity must have a key to be saved. If you don't specify an
// identifier for the key, one is generated for you.
//
// We will create a key with a `name` identifier, "Google".
//-
const key = datastore.key(['Company', 'Google']);

const data = {
  name: 'Google',
  location: 'CA'
};

datastore.save({
  key: key,
  data: data
}, (err) => {
  if (!err) {
    // Record saved successfully.
  }
});

//-
// We can verify the data was saved by using Datastore#get.
//-
datastore.get(key, (err, entity) => {
  // entity = {
  //   name: 'Google',
  //   location: 'CA'
  // }
});

//-
// If we want to update this record, we can modify the data object and re-
// save it.
//-
data.symbol = 'GOOG';

datastore.save({
  key: key, // defined above (datastore.key(['Company', 'Google']))
  data: data
}, (err, entity) => {
  if (!err) {
    // Record updated successfully.
  }
});

```
Deleting Records
```
// Entities can be removed from Datastore by passing the entity's key object
// to Datastore#delete.
//-
const key = datastore.key(['Company', 'Google']);

datastore.delete(key, (err) => {
  if (!err) {
    // Record deleted successfully.
  }
});

```
Transactions
```
// Complex logic can be wrapped in a transaction with
// Datastore#transaction. All queries and updates run within
// the transaction will be applied when the `done` function is called.
//-
const transaction = datastore.transaction();

transaction.run((err) => {
  if (err) {
    // Error handling omitted.
  }

  const key = datastore.key(['Company', 'Google']);

  transaction.get(key, (err, entity) => {
    if (err) {
      // Error handling omitted.
    }

    entity.symbol = 'GOOG';

    transaction.save(entity);

    transaction.commit((err) => {
      if (!err) {
        // Transaction committed successfully.
      }
    });
  });
});

```
Queries with Ancestors
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();

const customerId1 = 2993844;
const customerId2 = 4993882;
const customerKey1 = datastore.key(['Customer', customerId1]);
const customerKey2 = datastore.key(['Customer', customerId2]);
const cookieKey1 = datastore.key(['Customer', customerId1, 'Cookie',
'cookie28839']); // child entity const cookieKey2 =
datastore.key(['Customer', customerId1, 'Cookie', 'cookie78984']); // child
entity const cookieKey3 = datastore.key(['Customer', customerId2, 'Cookie',
'cookie93911']); // child entity

const entities = [];

entities.push({
  key: customerKey1,
  data: {
    name: 'Jane Doe',
    address: '4848 Liller'
  }
});

entities.push({
  key: customerKey2,
  data: {
    name: 'John Smith',
    address: '4848 Pine'
  }
});

entities.push({
  key: cookieKey1,
  data: {
    cookieVal: 'dj83kks88rkld'
  }
});

entities.push({
  key: cookieKey2,
  data: {
    cookieVal: 'sj843ka99s'
  }
});

entities.push({
  key: cookieKey3,
  data: {
    cookieVal: 'otk82k2kw'
  }
});

datastore.upsert(entities);

const query = datastore.createQuery().hasAncestor(customerKey1);

datastore.runQuery(query, (err, entities) => {
  for (let entity of entities) {
    console.log(entity[datastore.KEY]);
  }
});

const query2 = datastore.createQuery().hasAncestor(customerKey2);

datastore.runQuery(query2, (err, entities) => {
  for (let entity of entities) {
    console.log(entity[datastore.KEY]);
  }
});

datastore.runQuery(query2, (entities) => {
  console.log(entities);
});
```

Members

KEY

Access the Key from an Entity object.

namespace

DatastoreRequest

See:

KEY

Access the Key from an Entity object.

MORE_RESULTS_AFTER_CURSOR

This is one of three values which may be returned from Datastore#runQuery, Transaction#runQuery, and Query#run as info.moreResults.

There may be more results after the specified end cursor.

MORE_RESULTS_AFTER_LIMIT

This is one of three values which may be returned from Datastore#runQuery, Transaction#runQuery, and Query#run as info.moreResults.

There may be more results after the specified limit.

NO_MORE_RESULTS

This is one of three values which may be returned from Datastore#runQuery, Transaction#runQuery, and Query#run as info.moreResults.

There are no more results left to query for.

Query

Query class.

See:

Transaction

Transaction class.

See:

v1

Properties:
Name Type Description
DatastoreClient constructor

Reference to v1.DatastoreClient.

See:

Methods

createAggregationQuery(query)

Create an aggregation query from a Query.

Parameters:
Name Type Description
query Query

A Query object.

getDatabaseId() → {string}

Gets the database id that all requests will be run against.

Returns:
Type Description
string

The database id that the current client is set to that requests will run against.

getIndexesStream(optionsopt) → {ReadableStream.<Index>}

Get all of the indexes in this project as a readable object stream.

Parameters:
Name Type Attributes Description
options GetIndexesOptions <optional>

Configuration object. See Datastore#getIndexes for a complete list of options.

Returns:
Type Description
ReadableStream.<Index>

index(id) → {Index}

Get a reference to an Index.

Parameters:
Name Type Description
id string

The index name or id.

Returns:
Type Description
Index

keyFromLegacyUrlsafe(key, locationPrefix) → {string}

Helper to convert URL safe key string to entity key object

This is intended to work with the "legacy" representation of a datastore "Key" used within Google App Engine (a so-called "Reference").

Parameters:
Name Type Description
key entity.Key

Entity key object.

locationPrefix string

Optional . The location prefix of an App Engine project ID. Often this value is 's~', but may also be 'e~', or other location prefixes currently unknown.

Returns:
Type Description
string

Created urlsafe key.

Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const urlSafeKey = 'ag9ncmFzcy1jbHVtcC00NzlyEwsSB0NvbXBhbnkiBkdvb2dsZQw';

datastore.keyFromLegacyUrlsafe(key);

```

transaction(optionsopt) → {Transaction}

Create a new Transaction object.

Parameters:
Name Type Attributes Description
options object <optional>

Configuration object.

Properties
Name Type Attributes Default Description
id string <optional>

The ID of a previously run transaction.

readOnly boolean <optional>
false

A read-only transaction cannot modify entities.

Returns:
Type Description
Transaction
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const transaction = datastore.transaction();
```

(static) double(value) → {object}

Helper function to get a Datastore Double object.

Parameters:
Name Type Description
value number

The double value.

Returns:
Type Description
object
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const threeDouble = datastore.double(3.0);
```

(static) geoPoint(coordinates) → {object}

Helper function to get a Datastore Geo Point object.

Parameters:
Name Type Description
coordinates object

Coordinate value.

Properties
Name Type Description
latitude number

Latitudinal value.

longitude number

Longitudinal value.

Returns:
Type Description
object
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const coordinates = {
  latitude: 40.6894,
  longitude: -74.0447
};

const geoPoint = datastore.geoPoint(coordinates);

//-
// List all companies that are located at 40.123 latitude
// and -74.0447 longitude.
//-
const query = datastore.createQuery('Company');
const companyQuery = query
  .filter('geoPoint.latitude', datastore.double(40.123))
  .filter('geoPoint.longitude', datastore.double(-74.0447));
```

(static) int(value) → {object}

Helper function to get a Datastore Integer object.

This is also useful when using an ID outside the bounds of a JavaScript Number object.

Parameters:
Name Type Description
value number

The integer value.

Returns:
Type Description
object
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const sevenInteger = datastore.int(7);

//-
// Create an Int to support long Key IDs.
//-
const key = datastore.key([
  'Kind',
  datastore.int('100000000000001234')
]);
```

(static) isDouble(value) → {boolean}

Helper function to check if something is a Datastore Double object.

Parameters:
Name Type Description
value *
Returns:
Type Description
boolean
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
datastore.isDouble(0.42); // false
datastore.isDouble(datastore.double(0.42)); // true
```

(static) isGeoPoint(value) → {boolean}

Helper function to check if something is a Datastore Geo Point object.

Parameters:
Name Type Description
value *
Returns:
Type Description
boolean
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const coordinates = {
  latitude: 0,
  longitude: 0
};

datastore.isGeoPoint(coordinates); // false
datastore.isGeoPoint(datastore.geoPoint(coordinates)); // true
```

(static) isInt(value) → {boolean}

Helper function to check if something is a Datastore Integer object.

Parameters:
Name Type Description
value *
Returns:
Type Description
boolean
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
datastore.isInt(42); // false
datastore.isInt(datastore.int(42)); // true
```

(static) isKey(value) → {boolean}

Helper function to check if something is a Datastore Key object.

Parameters:
Name Type Description
value *
Returns:
Type Description
boolean
Example
```
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
datastore.isKey({path: ['Company', 123]}); // false
datastore.isKey(datastore.key(['Company', 123])); // true
```