DatastoreRequest
Source: request.
Handle logic for Datastore API operations. Handles request logic for Datastore.
Creates requests to the Datastore endpoint. Designed to be inherited by the Datastore and Transaction classes.
Methods
new DatastoreRequest()
Methods
allocateIds(key, options, callback)
Generate IDs without creating entities.
Example
const incompleteKey = datastore.key(['Company']);
//-
// The following call will create 100 new IDs from the Company kind, which
// exists under the default namespace.
//-
datastore.allocateIds(incompleteKey, 100, (err, keys) => {});
//-
// Or, if you're using a transaction object.
//-
const transaction = datastore.transaction();
transaction.run((err) => {
if (err) {
// Error handling omitted.
}
transaction.allocateIds(incompleteKey, 100, (err, keys) => {
if (err) {
// Error handling omitted.
}
transaction.commit((err) => {
if (!err) {
// Transaction committed successfully.
}
});
});
});
//-
// You may prefer to create IDs from a non-default namespace by providing
an
// incomplete key with a namespace. Similar to the previous example, the
call
// below will create 100 new IDs, but from the Company kind that exists
under
// the "ns-test" namespace.
//-
const incompleteKey = datastore.key({
namespace: 'ns-test',
path: ['Company']
});
function callback(err, keys, apiResponse) {}
datastore.allocateIds(incompleteKey, 100, callback);
//-
// Returns a Promise if callback is omitted.
//-
datastore.allocateIds(incompleteKey, 100).then((data) => {
const keys = data[0];
const apiResponse = data[1];
});
Parameters
| Name | Type | Optional | Description | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
key |
|
The key object to complete. |
|||||||||||||||||
|
options |
(number or object) |
|
Either the number of IDs to allocate or an options object for further customization of the request. Values in
|
||||||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
createReadStream(keys[, options])
Retrieve the entities as a readable object stream.
Example
const keys = [
datastore.key(['Company', 123]),
datastore.key(['Product', 'Computer'])
];
datastore.createReadStream(keys)
.on('error', (err) => {})
.on('data', (entity) => {
// entity is an entity object.
})
.on('end', () => {
// All entities retrieved.
});
Parameters
| Name | Type | Optional | Description |
|---|---|---|---|
|
keys |
|
Datastore key object(s). |
|
|
options |
object |
Yes |
Optional configuration. See Datastore#get for a complete list of options. |
- Throws
-
ErrorIf at least one Key object is not provided.
delete(key[, gaxOptions], callback)
Delete all entities identified with the specified key(s).
Example
const key = datastore.key(['Company', 123]);
datastore.delete(key, (err, apiResp) => {});
//-
// Or, if you're using a transaction object.
//-
const transaction = datastore.transaction();
transaction.run((err) => {
if (err) {
// Error handling omitted.
}
transaction.delete(key);
transaction.commit((err) => {
if (!err) {
// Transaction committed successfully.
}
});
});
//-
// Delete multiple entities at once.
//-
datastore.delete([
datastore.key(['Company', 123]),
datastore.key(['Product', 'Computer'])
], (err, apiResponse) => {});
//-
// Returns a Promise if callback is omitted.
//-
datastore.delete().then((data) => {
const apiResponse = data[0];
});
Parameters
| Name | Type | Optional | Description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
key |
|
Datastore key object(s). |
|||||||||||||
|
gaxOptions |
object |
Yes |
Request configuration options, outlined here: https://googleapis.github.io/gax-nodejs/global.html#CallOptions. |
||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
get(keys[, options], callback)
Retrieve the entities identified with the specified key(s) in the current transaction. Get operations require a valid key to retrieve the key-identified entity from Datastore.
Example
//-
// Get a single entity.
//-
const key = datastore.key(['Company', 123]);
datastore.get(key, (err, entity) => {});
//-
// Or, if you're using a transaction object.
//-
const transaction = datastore.transaction();
transaction.run((err) => {
if (err) {
// Error handling omitted.
}
transaction.get(key, (err, entity) => {
if (err) {
// Error handling omitted.
}
transaction.commit((err) => {
if (!err) {
// Transaction committed successfully.
}
});
});
});
//-
// Get multiple entities at once with a callback.
//-
const keys = [
datastore.key(['Company', 123]),
datastore.key(['Product', 'Computer'])
];
datastore.get(keys, (err, entities) => {});
//-
// Below is how to update the value of an entity with the help of the
// `save` method.
//-
datastore.get(key, (err, entity) => {
if (err) {
// Error handling omitted.
}
entity.newValue = true;
datastore.save({
key: key,
data: entity
}, (err) => {});
});
//-
// Returns a Promise if callback is omitted.
//-
datastore.get(keys).then((data) => {
const entities = data[0];
});
Parameters
| Name | Type | Optional | Description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
keys |
|
Datastore key object(s). |
|||||||||||||
|
options |
object |
Yes |
Optional configuration. Values in
|
||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
- Throws
-
ErrorIf at least one Key object is not provided.
insert(entities, callback)
Maps to Datastore#save, forcing the method to be insert.
Parameters
| Name | Type | Optional | Description | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
entities |
(object or Array of object) |
|
Datastore key object(s). Values in
|
||||||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
runQuery(query[, options][, callback])
Datastore allows you to query entities by kind, filter them by property filters, and sort them by a property name. Projection and pagination are also supported.
The query is run, and the results are returned as the second argument to your callback. A third argument may also exist, which is a query object that uses the end cursor from the previous query as the starting cursor for the next query. You can pass that object back to this method to see if more results exist.
Example
//-
// Where you see `transaction`, assume this is the context that's relevant
to
// your use, whether that be a Datastore or a Transaction object.
//-
const query = datastore.createQuery('Lion');
datastore.runQuery(query, (err, entities, info) => {
// entities = An array of records.
// Access the Key object for an entity.
const firstEntityKey = entities[0][datastore.KEY];
});
//-
// Or, if you're using a transaction object.
//-
const transaction = datastore.transaction();
transaction.run((err) => {
if (err) {
// Error handling omitted.
}
transaction.runQuery(query, (err, entities) => {
if (err) {
// Error handling omitted.
}
transaction.commit((err) => {
if (!err) {
// Transaction committed successfully.
}
});
});
});
//-
// A keys-only query returns just the keys of the result entities instead
of
// the entities themselves, at lower latency and cost.
//-
const keysOnlyQuery = datastore.createQuery('Lion').select('__key__');
datastore.runQuery(keysOnlyQuery, (err, entities) => {
const keys = entities.map((entity) => {
return entity[datastore.KEY];
});
});
//-
// Returns a Promise if callback is omitted.
//-
datastore.runQuery(query).then((data) => {
const entities = data[0];
});
Parameters
| Name | Type | Optional | Description | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
query |
|
Query object. |
|||||||||||||||||||||||||
|
options |
object |
Yes |
Optional configuration. Values in
|
||||||||||||||||||||||||
|
callback |
function() |
Yes |
The callback function. If omitted, a readable stream instance is returned. Values in
|
runQueryStream(query[, options])
Get a list of entities as a readable object stream.
See Datastore#runQuery for a list of all available options.
Example
datastore.runQueryStream(query)
.on('error', console.error)
.on('data', (entity) => {
// Access the Key object for this entity.
const key = entity[datastore.KEY];
})
.on('info', (info) => {})
.on('end', () => {
// All entities retrieved.
});
//-
// If you anticipate many results, you can end a stream early to prevent
// unnecessary processing and API requests.
//-
datastore.runQueryStream(query)
.on('data', (entity) => {
this.end();
});
Parameters
| Name | Type | Optional | Description | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
query |
|
Query object. |
|||||||||
|
options |
object |
Yes |
Optional configuration. Values in
|
save(entities[, gaxOptions], callback)
Insert or update the specified object(s). If a key is incomplete, its associated object is inserted and the original Key object is updated to contain the generated ID.
This method will determine the correct Datastore method to execute
(upsert, insert, or update) by using the key(s) provided. For
example, if you provide an incomplete key (one without an ID), the request
will create a new entity and have its ID automatically assigned. If you
provide a complete key, the entity will be updated with the data specified.
By default, all properties are indexed. To prevent a property from being
included in all indexes, you must supply an excludeFromIndexes array.
See below for an example.
Example
//-
// Save a single entity.
//
// Notice that we are providing an incomplete key. After saving, the
original
// Key object used to save will be updated to contain the path with its
// generated ID.
//-
const key = datastore.key('Company');
const entity = {
key: key,
data: {
rating: '10'
}
};
datastore.save(entity, (err) => {
console.log(key.path); // [ 'Company', 5669468231434240 ]
console.log(key.namespace); // undefined
});
//-
// Save a single entity using a provided name instead of auto-generated ID.
//
// Here we are providing a key with name instead of an ID. After saving,
the
// original Key object used to save will be updated to contain the path
with
// the name instead of a generated ID.
//-
const key = datastore.key(['Company', 'donutshack']);
const entity = {
key: key,
data: {
name: 'DonutShack',
rating: 8
}
};
datastore.save(entity, (err) => {
console.log(key.path); // ['Company', 'donutshack']
console.log(key.namespace); // undefined
});
//-
// Save a single entity with a provided namespace. Namespaces allow for
// multitenancy. To read more about this, see
// [the Datastore docs on key concepts](https://goo.gl/M1LUAu).
//
// Here we are providing a key with namespace.
//-
const key = datastore.key({
namespace: 'my-namespace',
path: ['Company', 'donutshack']
});
const entity = {
key: key,
data: {
name: 'DonutShack',
rating: 8
}
};
datastore.save(entity, (err) => {
console.log(key.path); // ['Company', 'donutshack']
console.log(key.namespace); // 'my-namespace'
});
//-
// Save different types of data, including ints, doubles, dates, booleans,
// blobs, and lists.
//
// Notice that we are providing an incomplete key. After saving, the
original
// Key object used to save will be updated to contain the path with its
// generated ID.
//-
const key = datastore.key('Company');
const entity = {
key: key,
data: {
name: 'DonutShack',
rating: datastore.int(10),
worth: datastore.double(123456.78),
location: datastore.geoPoint({
latitude: 40.6894,
longitude: -74.0447
}),
numDonutsServed: 45,
founded: new Date('Tue May 12 2015 15:30:00 GMT-0400 (EDT)'),
isStartup: true,
donutEmoji: Buffer.from('\uD83C\uDF69'),
keywords: [
'donut',
'coffee',
'yum'
]
}
};
datastore.save(entity, (err, apiResponse) => {});
//-
// Use an array, `excludeFromIndexes`, to exclude properties from indexing.
// This will allow storing string values larger than 1500 bytes.
//-
const entity = {
key: datastore.key('Company'),
excludeFromIndexes: [
'description',
'embeddedEntity.description',
'arrayValue[]',
'arrayValue[].description'
],
data: {
description: 'Long string (...)',
embeddedEntity: {
description: 'Long string (...)'
},
arrayValue: [
'Long string (...)',
{
description: 'Long string (...)'
}
]
}
};
datastore.save(entity, (err, apiResponse) => {});
//-
// Save multiple entities at once.
//-
const companyKey = datastore.key(['Company', 123]);
const productKey = datastore.key(['Product', 'Computer']);
const entities = [
{
key: companyKey,
data: {
HQ: 'Dallas, TX'
}
},
{
key: productKey,
data: {
vendor: 'Dell'
}
}
];
datastore.save(entities, (err, apiResponse) => {});
//-
// Explicitly attempt to 'insert' a specific entity.
//-
const userKey = datastore.key(['User', 'chilts']);
const entity = {
key: userKey,
method: 'insert',
data: {
fullName: 'Andrew Chilton'
}
};
datastore.save(entity, (err, apiResponse) => {});
//-
// Returns a Promise if callback is omitted.
//-
datastore.save(entity).then((data) => {
const apiResponse = data[0];
});
Parameters
| Name | Type | Optional | Description | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
entities |
(object or Array of object) |
|
Datastore key object(s). Values in
|
||||||||||||||||||||
|
gaxOptions |
object |
Yes |
Request configuration options, outlined here: https://googleapis.github.io/gax-nodejs/global.html#CallOptions. |
||||||||||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
- Throws
-
ErrorIf an unrecognized method is provided.
update(entities, callback)
Maps to Datastore#save, forcing the method to be update.
Parameters
| Name | Type | Optional | Description | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
entities |
(object or Array of object) |
|
Datastore key object(s). Values in
|
||||||||||||||||
|
callback |
function() |
|
The callback function. Values in
|
upsert(entities, callback)
Maps to Datastore#save, forcing the method to be upsert.
Parameters
| Name | Type | Optional | Description | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
entities |
(object or Array of object) |
|
Datastore key object(s). Values in
|
||||||||||||||||
|
callback |
function() |
|
The callback function. Values in
|