diff --git a/devel/assets/search.js b/devel/assets/search.js index 99ac0c9bb..9eaaef307 100644 --- a/devel/assets/search.js +++ b/devel/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/devel/classes/analyzers.Analyzer.html b/devel/classes/analyzers.Analyzer.html index 73143bf1e..5e5731f59 100644 --- a/devel/classes/analyzers.Analyzer.html +++ b/devel/classes/analyzers.Analyzer.html @@ -1,27 +1,27 @@ -
Represents an Analyzer in a databases.Database.
+Name of this Analyzer.
+Name of this Analyzer.
See also databases.Database.
-Creates a new Analyzer with the given options
and the instance's name.
Creates a new Analyzer with the given options
and the instance's name.
See also databases.Database#createAnalyzer.
Options for creating the Analyzer.
const db = new Database();
const analyzer = db.analyzer("potatoes");
await analyzer.create({ type: "identity" });
// the identity Analyzer "potatoes" now exists
-Deletes the Analyzer from the database.
+Deletes the Analyzer from the database.
Whether the Analyzer should still be deleted even if it is currently in use.
const db = new Database();
const analyzer = db.analyzer("some-analyzer");
await analyzer.drop();
// the Analyzer "some-analyzer" no longer exists
-Retrieves the Analyzer definition for the Analyzer.
+Retrieves the Analyzer definition for the Analyzer.
const db = new Database();
const analyzer = db.analyzer("some-analyzer");
const definition = await analyzer.get();
// definition contains the Analyzer definition
-The BatchCursor
provides a batch-wise API to an Cursor.
The BatchCursor
provides a batch-wise API to an Cursor.
When using TypeScript, cursors can be cast to a specific item type in order to increase type safety.
const db = new Database();
const query = aql`FOR x IN 1..5 RETURN x`;
const cursor = await db.query(query) as Cursor<number>;
const batches = cursor.batches;
@@ -6,7 +6,7 @@
Example
const db = new Database();
const query = aql`FOR x IN 1..10000 RETURN x`;
const cursor = await db.query(query, { batchSize: 10 });
for await (const batch of cursor.batches) {
// Process all values in a batch in parallel
await Promise.all(batch.map(
value => asyncProcessValue(value)
));
}
Total number of documents in the query result. Only available if the
count
option was used.
Additional information about the cursor.
-Whether the cursor has any remaining batches that haven't yet been +
Additional information about the cursor.
+Whether the cursor has any remaining batches that haven't yet been
fetched. If set to false
, all batches have been fetched and no
additional requests to the server will be made when consuming any
remaining batches from this cursor.
Whether the cursor has more batches. If set to false
, the cursor has
+
Whether the cursor has more batches. If set to false
, the cursor has
already been depleted and contains no more batches.
ID of this cursor.
-ID of this cursor.
+A low-level interface for consuming the items of this BatchCursor.
-A low-level interface for consuming the items of this BatchCursor.
+Enables use with for await
to deplete the cursor by asynchronously
yielding every batch in the cursor's remaining result set.
Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the @@ -45,11 +45,11 @@
const
const cursor = await db.query(aql`
FOR user IN users
FILTER user.isActive
RETURN user
`);
for await (const users of cursor.batches) {
for (const user of users) {
console.log(user.email, user.isAdmin);
}
}
-Depletes the cursor, then returns an array containing all batches in the +
Depletes the cursor, then returns an array containing all batches in the cursor's remaining result list.
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 2 }
);
const result = await cursor.batches.all(); // [[1, 2], [3, 4], [5]]
console.log(cursor.hasNext); // false
-Depletes the cursor by applying the callback
function to each batch in
the cursor's remaining result list. Returns an array containing the
return values of callback
for each batch, flattened to a depth of 1.
Note: If the result set spans multiple batches, any remaining batches @@ -64,7 +64,7 @@
const
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 1 }
);
const odds = await cursor.batches.flatMap((currentBatch) => {
if (currentBatch[0] % 2 === 0) {
return []; // empty array flattens into nothing
}
return currentBatch;
});
console.logs(odds); // [1, 3, 5]
-Advances the cursor by applying the callback
function to each item in
the cursor's remaining result list until the cursor is depleted or
callback
returns the exact value false
. Returns a promise that
evalues to true
unless the function returned false
.
const
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 2 }
);
const result = await cursor.batches.forEach((currentBatch) => {
for (const value of currentBatch) {
console.log(value);
}
return false; // stop after the first batch
});
console.log(result); // false
console.log(cursor.hasNext); // true
-Drains the cursor and frees up associated database resources.
This method has no effect if all batches have already been consumed.
const cursor1 = await db.query(aql`FOR x IN 1..5 RETURN x`);
console.log(cursor1.hasMore); // false
await cursor1.kill(); // no effect
const cursor2 = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 2 }
);
console.log(cursor2.hasMore); // true
await cursor2.kill(); // cursor is depleted
-Loads all remaining batches from the server.
Warning: This may impact memory use when working with very large query result sets.
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 1 }
);
console.log(cursor.hasMore); // true
await cursor.batches.loadAll();
console.log(cursor.hasMore); // false
console.log(cursor.hasNext); // true
for await (const item of cursor) {
console.log(item);
// No server roundtrips necessary any more
}
-Depletes the cursor by applying the callback
function to each batch in
the cursor's remaining result list. Returns an array containing the
return values of callback
for each batch.
Note: This creates an array of all return values, which may impact @@ -101,7 +101,7 @@
constParameters
Returns Promise<R[]>
Example
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 2 }
);
const squares = await cursor.batches.map((currentBatch) => {
return currentBatch.map((value) => value ** 2);
});
console.log(squares); // [[1, 4], [9, 16], [25]]
console.log(cursor.hasNext); // false
-next
- next(): Promise<undefined | ItemType[]>
Advances the cursor and returns all remaining values in the cursor's
+
next
- next(): Promise<undefined | ItemType[]>
Advances the cursor and returns all remaining values in the cursor's
current batch. If the current batch has already been exhausted, fetches
the next batch from the server and returns it, or undefined
if the
cursor has been depleted.
@@ -111,7 +111,7 @@ Example
const
Returns Promise<undefined | ItemType[]>
Example
const cursor = await db.query(
aql`FOR i IN 1..10 RETURN i`,
{ batchSize: 5 }
);
const firstBatch = await cursor.batches.next(); // [1, 2, 3, 4, 5]
await cursor.next(); // 6
const lastBatch = await cursor.batches.next(); // [7, 8, 9, 10]
console.log(cursor.hasNext); // false
-
reduce
reduce
- reduce<R>(reducer, initialValue): Promise<R>
Depletes the cursor by applying the reducer
function to each batch in
the cursor's remaining result list. Returns the return value of reducer
for the last batch.
Note: Most complex uses of the reduce
method can be replaced with
@@ -131,7 +131,7 @@
Example
const
Example
// BAD! NEEDLESSLY COMPLEX!
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 1 }
);
const result = await cursor.reduce((accumulator, currentBatch) => {
if (currentBatch[0] % 2 === 0) {
accumulator.even.push(...currentBatch);
} else {
accumulator.odd.push(...currentBatch);
}
return accumulator;
}, { odd: [], even: [] });
console.log(result); // { odd: [1, 3, 5], even: [2, 4] }
// GOOD! MUCH SIMPLER!
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const odd = [];
const even = [];
for await (const currentBatch of cursor) {
if (currentBatch[0] % 2 === 0) {
even.push(...currentBatch);
} else {
odd.push(...currentBatch);
}
}
console.log({ odd, even }); // { odd: [1, 3, 5], even: [2, 4] }
-- reduce<R>(reducer): Promise<undefined | R>
Depletes the cursor by applying the reducer
function to each batch in
+
- reduce<R>(reducer): Promise<undefined | R>
Depletes the cursor by applying the reducer
function to each batch in
the cursor's remaining result list. Returns the return value of reducer
for the last batch.
Note: If the result set spans multiple batches, any remaining batches
@@ -144,4 +144,4 @@
Example
// BAD! NEEDLE
Parameters
Returns Promise<undefined | R>
Example
function largestValue(values1, values2) {
return [Math.max(...values1, ...values2)];
}
const cursor = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 3 }
);
const result = await cursor.batches.reduce(largestValue);
console.log(result); // [5]
console.log(cursor.hasNext); // false
-
The Cursor
type represents a cursor returned from a
+
The Cursor
type represents a cursor returned from a
databases.Database#query.
When using TypeScript, cursors can be cast to a specific item type in order to increase type safety.
@@ -8,7 +8,7 @@const db = new Database();
const query = aql`FOR x IN 1..10 RETURN x`;
const cursor = await db.query(query);
for await (const value of cursor) {
// Process each value asynchronously
await processValue(value);
}
A BatchCursor providing batch-wise access to the cursor result set.
See also BatchCursor#items.
-Total number of documents in the query result. Only available if the +
Total number of documents in the query result. Only available if the
count
option was used.
Additional information about the cursor.
-Whether the cursor has more values. If set to false
, the cursor has
+
Additional information about the cursor.
+Whether the cursor has more values. If set to false
, the cursor has
already been depleted and contains no more items.
ID of this cursor.
-Enables use with for await
to deplete the cursor by asynchronously
+
ID of this cursor.
+Enables use with for await
to deplete the cursor by asynchronously
yielding every value in the cursor's remaining result set.
Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the @@ -40,11 +40,11 @@
const
const cursor = await db.query(aql`
FOR user IN users
FILTER user.isActive
RETURN user
`);
for await (const user of cursor) {
console.log(user.email, user.isAdmin);
}
-Depletes the cursor, then returns an array containing all values in the +
Depletes the cursor, then returns an array containing all values in the cursor's remaining result list.
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.all(); // [1, 2, 3, 4, 5]
console.log(cursor.hasNext); // false
-Depletes the cursor by applying the callback
function to each item in
the cursor's remaining result list. Returns an array containing the
return values of callback
for each item, flattened to a depth of 1.
Note: If the result set spans multiple batches, any remaining batches @@ -59,7 +59,7 @@
const
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const odds = await cursor.flatMap((currentValue) => {
if (currentValue % 2 === 0) {
return []; // empty array flattens into nothing
}
return currentValue; // or [currentValue]
});
console.logs(odds); // [1, 3, 5]
-Advances the cursor by applying the callback
function to each item in
the cursor's remaining result list until the cursor is depleted or
callback
returns the exact value false
. Returns a promise that
evalues to true
unless the function returned false
.
const
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.forEach((currentValue) => {
console.log(currentValue);
return false; // stop after the first item
});
console.log(result); // false
console.log(cursor.hasNext); // true
-Kills the cursor and frees up associated database resources.
This method has no effect if all batches have already been fetched.
const cursor1 = await db.query(aql`FOR x IN 1..5 RETURN x`);
console.log(cursor1.hasMore); // false
await cursor1.kill(); // no effect
const cursor2 = await db.query(
aql`FOR x IN 1..5 RETURN x`,
{ batchSize: 2 }
);
console.log(cursor2.hasMore); // true
await cursor2.kill(); // cursor is depleted
-Depletes the cursor by applying the callback
function to each item in
the cursor's remaining result list. Returns an array containing the
return values of callback
for each item.
Note: This creates an array of all return values, which may impact @@ -91,7 +91,7 @@
constParameters
Returns Promise<R[]>
Example
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const squares = await cursor.map((currentValue) => {
return currentValue ** 2;
});
console.log(squares); // [1, 4, 9, 16, 25]
console.log(cursor.hasNext); // false
-next
- next(): Promise<undefined | ItemType>
Advances the cursor and returns the next value in the cursor's remaining
+
next
- next(): Promise<undefined | ItemType>
Advances the cursor and returns the next value in the cursor's remaining
result list, or undefined
if the cursor has been depleted.
Note: If the result set spans multiple batches, any remaining batches
will only be fetched on demand. Depending on the cursor's TTL and the
@@ -99,7 +99,7 @@
Example
const
Returns Promise<undefined | ItemType>
Example
const cursor = await db.query(aql`FOR x IN 1..3 RETURN x`);
const one = await cursor.next(); // 1
const two = await cursor.next(); // 2
const three = await cursor.next(); // 3
const empty = await cursor.next(); // undefined
-
reduce
reduce
- reduce<R>(reducer, initialValue): Promise<R>
Depletes the cursor by applying the reducer
function to each item in
the cursor's remaining result list. Returns the return value of reducer
for the last item.
Note: Most complex uses of the reduce
method can be replaced with
@@ -118,7 +118,7 @@
Example
const
Example
// BAD! NEEDLESSLY COMPLEX!
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.reduce((accumulator, currentValue) => {
if (currentValue % 2 === 0) {
accumulator.even.push(...currentValue);
} else {
accumulator.odd.push(...currentValue);
}
return accumulator;
}, { odd: [], even: [] });
console.log(result); // { odd: [1, 3, 5], even: [2, 4] }
// GOOD! MUCH SIMPLER!
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const odd = [];
const even = [];
for await (const currentValue of cursor) {
if (currentValue % 2 === 0) {
even.push(currentValue);
} else {
odd.push(currentValue);
}
}
console.log({ odd, even }); // { odd: [1, 3, 5], even: [2, 4] }
-- reduce<R>(reducer): Promise<undefined | R>
Depletes the cursor by applying the reducer
function to each item in
+
- reduce<R>(reducer): Promise<undefined | R>
Depletes the cursor by applying the reducer
function to each item in
the cursor's remaining result list. Returns the return value of reducer
for the last item.
Note: If the result set spans multiple batches, any remaining batches
@@ -131,4 +131,4 @@
Example
// BAD! NEEDLE
Parameters
Returns Promise<undefined | R>
Example
function largestOfTwo(one, two) {
return Math.max(one, two);
}
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.reduce(largestOfTwo);
console.log(result); // 5
console.log(cursor.hasNext); // false
const emptyResult = await cursor.reduce(largestOfTwo);
console.log(emptyResult); // undefined
-
An object representing a single ArangoDB database. All arangojs collections, +
An object representing a single ArangoDB database. All arangojs collections,
cursors, analyzers and so on are linked to a Database
object.
Optional
config: ConfigOptionsAn object with configuration options.
const db = new Database({
url: "http://127.0.0.1:8529",
databaseName: "my_database",
auth: { username: "admin", password: "hunter2" },
});
-Creates a new Database
instance with its own connection pool.
Creates a new Database
instance with its own connection pool.
See also Database#database.
Base URL of the ArangoDB server or list of server URLs.
Equivalent to the url
option in configuration.ConfigOptions.
Optional
name: stringconst db = new Database("http://127.0.0.1:8529", "my_database");
db.useBasicAuth("admin", "hunter2");
-Name of the ArangoDB database this instance represents.
-Methods for accessing the server-reported queue times of the mostly +
Name of the ArangoDB database this instance represents.
+Methods for accessing the server-reported queue times of the mostly recently received responses.
-Updates the URL list by requesting a list of all coordinators in the +
Updates the URL list by requesting a list of all coordinators in the cluster and adding any endpoints not initially specified in the configuration.ConfigOptions.
For long-running processes communicating with an ArangoDB cluster it is @@ -146,23 +146,23 @@ replaced instead of extended.
const db = new Database();
const interval = setInterval(
() => db.acquireHostList(),
5 * 60 * 1000 // every 5 minutes
);
// later
clearInterval(interval);
system.close();
-Returns an analyzers.Analyzer instance representing the Analyzer with the +
Returns an analyzers.Analyzer instance representing the Analyzer with the
given analyzerName
.
const db = new Database();
const analyzer = db.analyzer("some-analyzer");
const info = await analyzer.get();
-Fetches all Analyzers visible in the database and returns an array of +
Fetches all Analyzers visible in the database and returns an array of analyzers.Analyzer instances for those Analyzers.
See also Database#listAnalyzers.
const db = new Database();
const analyzers = await db.analyzers();
// analyzers is an array of Analyzer instances
-Fetches availability information about the server.
+Fetches availability information about the server.
If set to true
, the method will always return false
instead of throwing an error; otherwise false
will only be returned
when the server responds with a 503 status code or an ArangoDB error with
a code of 503, such as during shutdown.
const availability = await db.availability();
// availability is either "default", "readonly", or false
-Begins a new streaming transaction for the given collections, then returns +
Begins a new streaming transaction for the given collections, then returns a transactions.Transaction instance for the transaction.
Collections can be specified as collection names (strings) or objects
implementing the collections.ArangoCollection interface: Collection
,
@@ -173,7 +173,7 @@
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const edges = db.collection("edges");
const trx = await db.beginTransaction({
read: ["vertices"],
write: [edges] // collection instances can be passed directly
});
const start = await trx.step(() => vertices.document("a"));
const end = await trx.step(() => vertices.document("b"));
await trx.step(() => edges.save({ _from: start._id, _to: end._id }));
await trx.commit();
-Begins a new streaming transaction for the given collections, then returns +
Begins a new streaming transaction for the given collections, then returns a transactions.Transaction instance for the transaction.
Collections can be specified as collection names (strings) or objects
implementing the collections.ArangoCollection interface: Collection
,
@@ -184,7 +184,7 @@
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const edges = db.collection("edges");
const trx = await db.beginTransaction([
"vertices",
edges // collection instances can be passed directly
]);
const start = await trx.step(() => vertices.document("a"));
const end = await trx.step(() => vertices.document("b"));
await trx.step(() => edges.save({ _from: start._id, _to: end._id }));
await trx.commit();
-Begins a new streaming transaction for the given collections, then returns +
Begins a new streaming transaction for the given collections, then returns a transactions.Transaction instance for the transaction.
The Collection can be specified as a collection name (string) or an object
implementing the collections.ArangoCollection interface: Collection
,
@@ -195,14 +195,14 @@
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const start = vertices.document("a");
const end = vertices.document("b");
const edges = db.collection("edges");
const trx = await db.beginTransaction(
edges // collection instances can be passed directly
);
await trx.step(() => edges.save({ _from: start._id, _to: end._id }));
await trx.commit();
-Clears the list of recent slow queries.
See also Database#listSlowQueries.
const db = new Database();
await db.clearSlowQueries();
// Slow query list is now cleared
-Clears the given ArangoDB user's access level for the database, or the +
Clears the given ArangoDB user's access level for the database, or the given collection in the given database.
Name of the ArangoDB user to clear the access level for.
Database and/or collection to clear the access level for.
@@ -218,14 +218,14 @@const
const db = new Database();
const staging = db.database("staging");
await db.clearUserAccessLevel("steve", {
collection: staging.collection("pokemons")
});
// The access level of the user "steve" has been cleared for the
// "pokemons" collection in database "staging".
-Closes all active connections of this database instance.
Can be used to clean up idling connections during longer periods of inactivity.
Note: This method currently has no effect in the browser version of arangojs.
const db = new Database();
const sessions = db.collection("sessions");
// Clean up expired sessions once per hour
setInterval(async () => {
await db.query(aql`
FOR session IN ${sessions}
FILTER session.expires < DATE_NOW()
REMOVE session IN ${sessions}
`);
// Making sure to close the connections because they're no longer used
system.close();
}, 1000 * 60 * 60);
-Returns a Collection
instance for the given collection name.
Returns a Collection
instance for the given collection name.
In TypeScript the collection implements both the collections.DocumentCollection and collections.EdgeCollection interfaces and can be cast to either type to enforce a stricter API.
@@ -240,7 +240,7 @@interface
interface Person {
name: string;
}
interface Friend {
startDate: number;
endDate?: number;
}
const db = new Database();
const documents = db.collection("persons") as DocumentCollection<Person>;
const edges = db.collection("friends") as EdgeCollection<Friend>;
-Fetches all collections from the database and returns an array of +
Fetches all collections from the database and returns an array of
Collection
instances.
In TypeScript these instances implement both the collections.DocumentCollection and collections.EdgeCollection @@ -251,7 +251,7 @@
interface
const db = new Database();
const collections = await db.collections(false);
// collections is an array of DocumentCollection and EdgeCollection
// instances including system collections
-Writes all locally available services to the database and updates any service bundles missing in the database.
If set to true
, outdated services will also be
committed. This can be used to solve some consistency problems when
@@ -260,18 +260,18 @@
const
await db.commitLocalServiceState(true);
// all service conflicts have been resolved in favor of this coordinator
-Compacts all databases on the server.
Options for compacting the databases.
-Computes a set of move shard operations to rebalance the cluster.
+Computes a set of move shard operations to rebalance the cluster.
const db = new Database();
const result = await db.computerClusterRebalance({
moveLeaders: true,
moveFollowers: true
});
if (result.moves.length) {
await db.executeClusterRebalance(result.moves);
}
-Creates a new Analyzer with the given analyzerName
and options
, then
+
Creates a new Analyzer with the given analyzerName
and options
, then
returns an analyzers.Analyzer instance for the new Analyzer.
Name of the Analyzer.
An object defining the properties of the Analyzer.
const db = new Database();
const analyzer = await db.createAnalyzer("potatoes", { type: "identity" });
// the identity Analyzer "potatoes" now exists
-Creates a new collection with the given collectionName
and options
,
+
Creates a new collection with the given collectionName
and options
,
then returns a collections.DocumentCollection instance for the new collection.
Type to represent document contents returned by the server (including computed properties).
@@ -283,7 +283,7 @@await<
interface Person {
name: string;
}
const db = new Database();
const documents = db.createCollection<Person>("persons");
-Creates a new edge collection with the given collectionName
and
+
Creates a new edge collection with the given collectionName
and
options
, then returns an collections.EdgeCollection instance for the new
edge collection.
Type to represent edge document contents returned @@ -296,19 +296,19 @@
interface
interface Friend {
startDate: number;
endDate?: number;
}
const db = new Database();
const edges = db.createCollection<Friend>("friends", {
type: CollectionType.EDGE_COLLECTION
});
-Creates a new database with the given databaseName
with the given
+
Creates a new database with the given databaseName
with the given
options
and returns a Database
instance for that database.
Name of the database to create.
Optional
options: CreateDatabaseOptionsOptions for creating the database.
const db = new Database();
const info = await db.createDatabase("mydb", {
users: [{ username: "root" }]
});
// the database has been created
-Creates a new database with the given databaseName
with the given
+
Creates a new database with the given databaseName
with the given
users
and returns a Database
instance for that database.
Name of the database to create.
Database users to create with the database.
const db = new Database();
const info = await db.createDatabase("mydb", [{ username: "root" }]);
// the database has been created
-Creates a new edge collection with the given collectionName
and
+
Creates a new edge collection with the given collectionName
and
options
, then returns an collections.EdgeCollection instance for the new
edge collection.
This is a convenience method for calling Database#createCollection @@ -323,18 +323,18 @@
interface
interface Friend {
startDate: number;
endDate?: number;
}
const db = new Database();
const edges = db.createEdgeCollection<Friend>("friends");
-Creates a graph with the given graphName
and edgeDefinitions
, then
+
Creates a graph with the given graphName
and edgeDefinitions
, then
returns a graphs.Graph instance for the new graph.
Name of the graph to be created.
An array of edge definitions.
Optional
options: CreateGraphOptionsAn object defining the properties of the graph.
-(Enterprise Edition only.) Creates a hot backup of the entire ArangoDB +
(Enterprise Edition only.) Creates a hot backup of the entire ArangoDB deployment including all databases, collections, etc.
Returns an object describing the backup result.
Options for creating the backup.
const info = await db.createHotBackup();
// a hot backup has been created
-Creates an async job by executing the given callback function. The first database request performed by the callback will be marked for asynchronous execution and its result will be made available as an async job.
Returns a jobs.Job instance that can be used to retrieve the result @@ -342,17 +342,17 @@
interfaceType Parameters
Parameters
Returns Promise<Job<T>>
Example
const db = new Database();
const job = await db.createJob(() => db.collections());
while (!job.isLoaded) {
await timeout(1000);
await job.load();
}
// job.result is a list of Collection instances
-create User
- create
User(username, passwd): Promise<ArangoApiResponse<ArangoUser>> Creates a new ArangoDB user with the given password.
+
create User
- create
User(username, passwd): Promise<ArangoApiResponse<ArangoUser>> Creates a new ArangoDB user with the given password.
Parameters
- username: string
Name of the ArangoDB user to create.
- passwd: string
Password of the new ArangoDB user.
Returns Promise<ArangoApiResponse<ArangoUser>>
Example
const db = new Database();
const user = await db.createUser("steve", "hunter2");
// The user "steve" has been created
-- create
User(username, options): Promise<ArangoApiResponse<ArangoUser>> Creates a new ArangoDB user with the given options.
+- create
User(username, options): Promise<ArangoApiResponse<ArangoUser>> Creates a new ArangoDB user with the given options.
Parameters
- username: string
Name of the ArangoDB user to create.
- options: UserOptions
Additional options for creating the ArangoDB user.
Returns Promise<ArangoApiResponse<ArangoUser>>
Example
const db = new Database();
const user = await db.createUser("steve", { passwd: "hunter2" });
// The user "steve" has been created
-
create User Function
- create
User Function(name, code, isDeterministic?): Promise<ArangoApiResponse<{
isNewlyCreated: boolean;
}>> Creates an AQL user function with the given name and code if it does
+
create User Function
- create
User Function(name, code, isDeterministic?): Promise<ArangoApiResponse<{
isNewlyCreated: boolean;
}>> Creates an AQL user function with the given name and code if it does
not already exist or replaces it if a function with the same name already
existed.
Parameters
- name: string
A valid AQL function name. The function name must consist
@@ -364,61 +364,61 @@
Example
interface
Returns Promise<ArangoApiResponse<{
isNewlyCreated: boolean;
}>>
Example
const db = new Database();
await db.createUserFunction(
"ACME::ACCOUNTING::CALCULATE_VAT",
"(price) => price * 0.19"
);
// Use the new function in an AQL query with template handler:
const cursor = await db.query(aql`
FOR product IN products
RETURN MERGE(
{ vat: ACME::ACCOUNTING::CALCULATE_VAT(product.price) },
product
)
`);
// cursor is a cursor for the query result
-
create View
- create
View(viewName, options): Promise<View> Creates a new View with the given viewName
and options
, then returns a
+
create View
- create
View(viewName, options): Promise<View> Creates a new View with the given viewName
and options
, then returns a
views.View instance for the new View.
Parameters
- viewName: string
Name of the View.
- options: CreateViewOptions
An object defining the properties of the View.
Returns Promise<View>
Example
const db = new Database();
const view = await db.createView("potatoes", { type: "arangosearch" });
// the ArangoSearch View "potatoes" now exists
-
database
- database(databaseName): Database
Creates a new Database
instance for the given databaseName
that
+
database
- database(databaseName): Database
Creates a new Database
instance for the given databaseName
that
shares this database's connection pool.
See also :constructor.
Parameters
- databaseName: string
Name of the database.
Returns Database
Example
const systemDb = new Database();
const myDb = systemDb.database("my_database");
-
databases
- databases(): Promise<Database[]>
Fetches all databases from the server and returns an array of Database
+
databases
- databases(): Promise<Database[]>
Fetches all databases from the server and returns an array of Database
instances for those databases.
See also Database#listDatabases and
Database#userDatabases.
Returns Promise<Database[]>
Example
const db = new Database();
const names = await db.databases();
// databases is an array of databases
-
delete All Job Results
delete Expired Job Results
delete All Job Results
delete Expired Job Results
- delete
Expired Job Results(threshold): Promise<void> Deletes the results of all completed async jobs created before the given
threshold.
Parameters
- threshold: number
The expiration timestamp in milliseconds.
Returns Promise<void>
Example
const db = new Database();
const ONE_WEEK = 7 * 24 * 60 * 60 * 1000;
await db.deleteExpiredJobResults(Date.now() - ONE_WEEK);
// all job results older than a week have been deleted
-
delete Hot Backup
delete Hot Backup
download Service
download Service
- download
Service(mount): Promise<Buffer | Blob> Retrieves a zip bundle containing the service files.
Returns a Buffer
in node.js or Blob
in the browser.
Parameters
- mount: string
The service's mount point, relative to the database.
Returns Promise<Buffer | Blob>
Example
const db = new Database();
const serviceBundle = await db.downloadService("/my-foxx");
-
drop Database
drop Database
drop User Function
- drop
User Function(name, group?): Promise<ArangoApiResponse<{
deletedCount: number;
}>> Deletes the AQL user function with the given name from the database.
+
drop User Function
- drop
User Function(name, group?): Promise<ArangoApiResponse<{
deletedCount: number;
}>> Deletes the AQL user function with the given name from the database.
Parameters
- name: string
The name of the user function to drop.
- group: boolean = false
If set to true
, all functions with a name starting with
name
will be deleted, otherwise only the function with the exact name
will be deleted.
Returns Promise<ArangoApiResponse<{
deletedCount: number;
}>>
Example
const db = new Database();
await db.dropUserFunction("ACME::ACCOUNTING::CALCULATE_VAT");
// the function no longer exists
-
engine
- engine(): Promise<EngineInfo>
Fetches storage engine information from the ArangoDB server.
+
engine
- engine(): Promise<EngineInfo>
Fetches storage engine information from the ArangoDB server.
Returns Promise<EngineInfo>
Example
const db = new Database();
const engine = await db.engine();
// the engine object contains the storage engine information, e.g.
// name: name of the storage engine
-
engine Stats
- engine
Stats(): Promise<EngineStatsInfo> Fetches detailed storage engine performance and resource usage information
+
engine Stats
- engine
Stats(): Promise<EngineStatsInfo> Fetches detailed storage engine performance and resource usage information
from the ArangoDB server.
Returns Promise<EngineStatsInfo>
Example
const db = new Database();
const stats = await db.engineStats();
// the stats object contains the storage engine stats
-
execute Cluster Rebalance
execute Cluster Rebalance
- execute
Cluster Rebalance(moves): Promise<unknown> Executes the given cluster move shard operations.
Parameters
- moves: ClusterRebalanceMove[]
Returns Promise<unknown>
Example
const db = new Database();
const result = await db.computerClusterRebalance({
moveLeaders: true,
moveFollowers: true
});
if (result.moves.length) {
await db.executeClusterRebalance(result.moves);
}
-
execute Transaction
execute Transaction
- execute
Transaction(collections, action, options?): Promise<any> Performs a server-side JavaScript transaction and returns its return
value.
Collections can be specified as collection names (strings) or objects
implementing the collections.ArangoCollection interface: Collection
,
@@ -439,7 +439,7 @@
Example
interface
const db = new Database();
const action = `
function(params) {
// This code will be executed inside ArangoDB!
const { query } = require("@arangodb");
return query\`
FOR user IN _users
FILTER user.age > ${params.age}
RETURN u.user
\`.toArray();
}
`);
const result = await db.executeTransaction({
read: ["_users"]
}, action, {
params: { age: 12 }
});
// result contains the return value of the action
-Performs a server-side transaction and returns its return value.
+Performs a server-side transaction and returns its return value.
Collections can be specified as collection names (strings) or objects
implementing the collections.ArangoCollection interface: Collection
,
graphs.GraphVertexCollection, graphs.GraphEdgeCollection as well as
@@ -458,7 +458,7 @@
interfaceOptional
options: TransactionOptions & {
params?: any;
}Options for the transaction.
const db = new Database();
const action = `
function(params) {
// This code will be executed inside ArangoDB!
const { query } = require("@arangodb");
return query\`
FOR user IN _users
FILTER user.age > ${params.age}
RETURN u.user
\`.toArray();
}
`);
const result = await db.executeTransaction(["_users"], action, {
params: { age: 12 }
});
// result contains the return value of the action
-Performs a server-side transaction and returns its return value.
+Performs a server-side transaction and returns its return value.
The Collection can be specified as a collection name (string) or an object
implementing the collections.ArangoCollection interface: Collection
,
graphs.GraphVertexCollection, graphs.GraphEdgeCollection as well as
@@ -477,10 +477,10 @@
interfaceOptional
options: TransactionOptions & {
params?: any;
}Options for the transaction.
const db = new Database();
const action = `
function(params) {
// This code will be executed inside ArangoDB!
const { query } = require("@arangodb");
return query\`
FOR user IN _users
FILTER user.age > ${params.age}
RETURN u.user
\`.toArray();
}
`);
const result = await db.executeTransaction("_users", action, {
params: { age: 12 }
});
// result contains the return value of the action
-Explains a database query using the given query
.
Explains a database query using the given query
.
See the aql.aql template string handler for information about how to create a query string without manually defining bind parameters nor having to worry about escaping variables.
@@ -489,7 +489,7 @@interfaceOptional
options: ExplainOptions & {
allPlans?: false;
}Options for explaining the query.
const db = new Database();
const collection = db.collection("some-collection");
const explanation = await db.explain(aql`
FOR doc IN ${collection}
FILTER doc.flavor == "strawberry"
RETURN doc._key
`);
-Explains a database query using the given query
.
Explains a database query using the given query
.
See the aql.aql template string handler for information about how to create a query string without manually defining bind parameters nor having to worry about escaping variables.
@@ -498,7 +498,7 @@interfaceOptional
options: ExplainOptions & {
allPlans: true;
}Options for explaining the query.
const db = new Database();
const collection = db.collection("some-collection");
const explanation = await db.explain(
aql`
FOR doc IN ${collection}
FILTER doc.flavor == "strawberry"
RETURN doc._key
`,
{ allPlans: true }
);
-Explains a database query using the given query
and bindVars
.
Explains a database query using the given query
and bindVars
.
See the aql.aql template string handler for a safer and easier alternative to passing strings directly.
An AQL query string.
@@ -506,7 +506,7 @@interfaceOptional
options: ExplainOptions & {
allPlans?: false;
}Options for explaining the query.
const db = new Database();
const collection = db.collection("some-collection");
const explanation = await db.explain(
`
FOR doc IN @@collection
FILTER doc.flavor == "strawberry"
RETURN doc._key
`,
{ "@collection": collection.name }
);
-Explains a database query using the given query
and bindVars
.
Explains a database query using the given query
and bindVars
.
See the aql.aql template string handler for a safer and easier alternative to passing strings directly.
An AQL query string.
@@ -514,34 +514,34 @@interfaceOptional
options: ExplainOptions & {
allPlans: true;
}Options for explaining the query.
const db = new Database();
const collection = db.collection("some-collection");
const explanation = await db.explain(
`
FOR doc IN @@collection
FILTER doc.flavor == "strawberry"
RETURN doc._key
`,
{ "@collection": collection.name },
{ allPlans: true }
);
-Fetches the database description for the active database from the server.
+Fetches the database description for the active database from the server.
const db = new Database();
const info = await db.get();
// the database exists
-Computes the current cluster imbalance.
+Computes the current cluster imbalance.
const db = new Database();
const imbalance = await db.getClusterImbalance();
-(Enterprise Edition only.) Retrieves a list of all locally found hot +
(Enterprise Edition only.) Retrieves a list of all locally found hot backups.
Optional
id: string | string[]If specified, only the backup with the given ID will be returned.
const backups = await db.getHotBackups();
for (const backup of backups.list) {
console.log(backup.id);
}
-Fetches the license information and status of an Enterprise Edition server.
-Retrieves the log messages from the server's global log.
+Fetches the license information and status of an Enterprise Edition server.
+Retrieves the log messages from the server's global log.
Optional
options: LogEntriesOptionsOptions for retrieving the log entries.
const log = await db.getLogEntries();
for (let i = 0; i < log.totalAmount; i++) {
console.log(`${
new Date(log.timestamp[i] * 1000).toISOString()
} - [${LogLevel[log.level[i]]}] ${log.text[i]} (#${log.lid[i]})`);
}
-Retrieves the server's current log level for each topic.
+Retrieves the server's current log level for each topic.
const levels = await db.getLogLevel();
console.log(levels.request); // log level for incoming requests
-Fetches the global properties for the AQL query results cache.
+Fetches the global properties for the AQL query results cache.
const db = new Database();
const properties = await db.getQueryCacheProperties();
console.log(properties);
-Retrieves information about a mounted service.
+Retrieves information about a mounted service.
The service's mount point, relative to the database.
const db = new Database();
const info = await db.getService("/my-service");
// info contains detailed information about the service
-Retrieves information about the service's configuration options and their +
Retrieves information about the service's configuration options and their current values.
See also Database#replaceServiceConfiguration and Database#updateServiceConfiguration.
@@ -551,7 +551,7 @@interface
const db = new Database();
const config = await db.getServiceConfiguration("/my-service");
for (const [key, option] of Object.entries(config)) {
console.log(`${option.title} (${key}): ${option.current}`);
}
-Retrieves information about the service's configuration options and their +
Retrieves information about the service's configuration options and their current values.
See also Database#replaceServiceConfiguration and Database#updateServiceConfiguration.
@@ -561,7 +561,7 @@interface
const db = new Database();
const config = await db.getServiceConfiguration("/my-service", true);
for (const [key, value] of Object.entries(config)) {
console.log(`${key}: ${value}`);
}
-Retrieves information about the service's dependencies and their current +
Retrieves information about the service's dependencies and their current mount points.
See also Database#replaceServiceDependencies and Database#updateServiceDependencies.
@@ -571,7 +571,7 @@interface
const db = new Database();
const deps = await db.getServiceDependencies("/my-service");
for (const [key, dep] of Object.entries(deps)) {
console.log(`${dep.title} (${key}): ${dep.current}`);
}
-Retrieves information about the service's dependencies and their current +
Retrieves information about the service's dependencies and their current mount points.
See also Database#replaceServiceDependencies and Database#updateServiceDependencies.
@@ -581,26 +581,26 @@interface
const db = new Database();
const deps = await db.getServiceDependencies("/my-service", true);
for (const [key, value] of Object.entries(deps)) {
console.log(`${key}: ${value}`);
}
-Retrieves an Open API compatible Swagger API description object for the +
Retrieves an Open API compatible Swagger API description object for the service installed at the given mount point.
The service's mount point, relative to the database.
const db = new Database();
const spec = await db.getServiceDocumentation("/my-service");
// spec is a Swagger API description of the service
-Retrieves the text content of the service's README
or README.md
file.
Returns undefined
if no such file could be found.
The service's mount point, relative to the database.
const db = new Database();
const readme = await db.getServiceReadme("/my-service");
if (readme !== undefined) console.log(readme);
else console.warn(`No README found.`)
-Retrieves an object mapping script names to their human readable representations, as defined in the service manifest's "scripts" section.
The service's mount point, relative to the database.
const db = new Database();
const scripts = await db.getServiceScripts("/my-service");
for (const [name, title] of Object.entries(scripts)) {
console.log(`${name}: ${title}`);
}
-Fetches the user data of a single ArangoDB user.
+Fetches the user data of a single ArangoDB user.
Name of the ArangoDB user to fetch.
const db = new Database();
const user = await db.getUser("steve");
// user is the user object for the user named "steve"
-Fetches the given ArangoDB user's access level for the database, or the +
Fetches the given ArangoDB user's access level for the database, or the given collection in the given database.
Name of the ArangoDB user to fetch the access level for.
Collection and/or database to fetch the access level for.
@@ -616,30 +616,30 @@const
const db = new Database();
const staging = db.database("staging");
const accessLevel = await db.getUserAccessLevel("steve", {
collection: staging.collection("pokemons")
});
// The access level of the user "steve" has been fetched for the
// "pokemons" collection in database "staging".
-Fetches an object mapping names of databases to the access level of the +
Fetches an object mapping names of databases to the access level of the given ArangoDB user for those databases.
Name of the ArangoDB user to fetch the access levels for.
Optional
full: falseWhether access levels for collections should be included.
const db = new Database();
const accessLevels = await db.getUserDatabases("steve");
for (const [databaseName, accessLevel] of Object.entries(accessLevels)) {
console.log(`${databaseName}: ${accessLevel}`);
}
-Fetches an object mapping names of databases to the access level of the +
Fetches an object mapping names of databases to the access level of the given ArangoDB user for those databases and the collections within each database.
Name of the ArangoDB user to fetch the access levels for.
Whether access levels for collections should be included.
const db = new Database();
const accessLevels = await db.getUserDatabases("steve", true);
for (const [databaseName, obj] of Object.entries(accessLevels)) {
console.log(`${databaseName}: ${obj.permission}`);
for (const [collectionName, accessLevel] of Object.entries(obj.collections)) {
console.log(`${databaseName}/${collectionName}: ${accessLevel}`);
}
}
-Returns a graphs.Graph instance representing the graph with the given +
Returns a graphs.Graph instance representing the graph with the given
graphName
.
Name of the graph.
const db = new Database();
const graph = db.graph("some-graph");
-Fetches all graphs from the database and returns an array of graphs.Graph +
Fetches all graphs from the database and returns an array of graphs.Graph instances for those graphs.
See also Database#listGraphs.
const db = new Database();
const graphs = await db.graphs();
// graphs is an array of Graph instances
-Installs a new service.
+Installs a new service.
The service's mount point, relative to the database.
The service bundle to install.
Options for installing the service.
@@ -649,21 +649,21 @@const
const db = new Database();
// Using a File from a browser file input as source
const element = document.getElementById("my-file-input");
const source = element.files[0];
const info = await db.installService("/hello", source);
-Kills a running query with the given queryId
.
See also Database#listRunningQueries.
The ID of a currently running query.
const db = new Database();
const queries = await db.listRunningQueries();
await Promise.all(queries.map(
async (query) => {
if (query.state === "executing") {
await db.killQuery(query.id);
}
}
));
-Fetches all Analyzers visible in the database and returns an array of +
Fetches all Analyzers visible in the database and returns an array of Analyzer descriptions.
See also Database#analyzers.
const db = new Database();
const analyzers = await db.listAnalyzers();
// analyzers is an array of Analyzer descriptions
-Fetches all collections from the database and returns an array of +
Fetches all collections from the database and returns an array of collection descriptions.
See also Database#collections.
Whether system collections should be excluded.
@@ -671,78 +671,78 @@const
const db = new Database();
const collections = await db.listCollections(false);
// collections is an array of collection descriptions
// including system collections
-Fetches all databases from the server and returns an array of their names.
See also Database#databases and Database#listUserDatabases.
const db = new Database();
const names = await db.listDatabases();
// databases is an array of database names
-Fetches all graphs from the database and returns an array of graph +
Fetches all graphs from the database and returns an array of graph descriptions.
See also Database#graphs.
const db = new Database();
const graphs = await db.listGraphs();
// graphs is an array of graph descriptions
-Retrieves the log messages from the server's global log.
+Retrieves the log messages from the server's global log.
Optional
options: LogEntriesOptionsOptions for retrieving the log entries.
This endpoint has been deprecated in ArangoDB 3.8. Use Database#getLogEntries instead.
const messages = await db.listLogMessages();
for (const m of messages) {
console.log(`${m.date} - [${m.level}] ${m.message} (#${m.id})`);
}
-Fetches a list of all entries in the AQL query results cache of the +
Fetches a list of all entries in the AQL query results cache of the current database.
const db = new Database();
const entries = await db.listQueryCacheEntries();
console.log(entries);
-Fetches a list of information for all currently running queries.
+Fetches a list of information for all currently running queries.
See also Database#listSlowQueries and Database#killQuery.
const db = new Database();
const queries = await db.listRunningQueries();
-Fetches a list of all installed service.
+Fetches a list of all installed service.
Whether system services should be excluded.
const db = new Database();
const services = await db.listServices();
const db = new Database();
const services = await db.listServices(false); // all services
-Fetches a list of information for all recent slow queries.
+Fetches a list of information for all recent slow queries.
See also Database#listRunningQueries and Database#clearSlowQueries.
const db = new Database();
const queries = await db.listSlowQueries();
// Only works if slow query tracking is enabled
-Fetches all active transactions from the database and returns an array of +
Fetches all active transactions from the database and returns an array of transaction descriptions.
See also Database#transactions.
const db = new Database();
const transactions = await db.listTransactions();
// transactions is an array of transaction descriptions
-Fetches all databases accessible to the active user from the server and returns an array of their names.
See also Database#userDatabases and Database#listDatabases.
const db = new Database();
const names = await db.listUserDatabases();
// databases is an array of database names
-Fetches a list of all AQL user functions registered with the database.
+Fetches a list of all AQL user functions registered with the database.
const db = new Database();
const functions = await db.listUserFunctions();
const names = functions.map(fn => fn.name);
-Fetches all ArangoDB users visible to the authenticated user and returns +
Fetches all ArangoDB users visible to the authenticated user and returns an array of user objects.
const db = new Database();
const users = await db.listUsers();
// users is an array of user objects
-Fetches all Views from the database and returns an array of View +
Fetches all Views from the database and returns an array of View descriptions.
See also Database#views.
const db = new Database();
const views = await db.listViews();
// views is an array of View descriptions
-Validates the given database credentials and exchanges them for an authentication token, then uses the authentication token for future requests and returns it.
The username to authenticate with.
The password to authenticate with.
const db = new Database();
await db.login("admin", "hunter2");
// with an authentication token for the "admin" user.
-Parses the given query and returns the result.
+Parses the given query and returns the result.
See the aql.aql template string handler for information about how to create a query string without manually defining bind parameters nor having to worry about escaping variables.
@@ -752,7 +752,7 @@const
const db = new Database();
const collection = db.collection("some-collection");
const ast = await db.parse(aql`
FOR doc IN ${collection}
FILTER doc.flavor == "strawberry"
RETURN doc._key
`);
aql.
-Performs a database query using the given query
, then returns a new
cursors.Cursor instance for the result set.
See the aql.aql template string handler for information about how to create a query string without manually defining bind parameters nor @@ -767,7 +767,7 @@
const
const db = new Database();
const active = true;
const Users = db.collection("_users");
// Using an object with a regular multi-line string
const cursor = await db.query({
query: `
FOR u IN @@users
FILTER u.authData.active == @active
RETURN u.user
`,
bindVars: { active: active, "@users": Users.name }
});
-Performs a database query using the given query
and bindVars
, then
+
Performs a database query using the given query
and bindVars
, then
returns a new cursors.Cursor instance for the result set.
See the aql.aql template string handler for a safer and easier alternative to passing strings directly.
@@ -781,45 +781,45 @@const
const db = new Database();
const active = true;
const Users = db.collection("_users");
const cursor = await db.query(
// An AQL literal created from a normal multi-line string
aql.literal(`
FOR u IN @@users
FILTER u.authData.active == @active
RETURN u.user
`),
{ active: active, "@users": Users.name }
);
-Fetches the available optimizer rules.
+Fetches the available optimizer rules.
const db = new Database();
const rules = await db.queryRules();
for (const rule of rules) {
console.log(rule.name);
}
-Fetches the query tracking properties.
+Fetches the query tracking properties.
const db = new Database();
const tracking = await db.queryTracking();
console.log(tracking.enabled);
-Modifies the query tracking properties.
+Modifies the query tracking properties.
Options for query tracking.
const db = new Database();
// track up to 5 slow queries exceeding 5 seconds execution time
await db.setQueryTracking({
enabled: true,
trackSlowQueries: true,
maxSlowQueries: 5,
slowQueryThreshold: 5
});
-Computes a set of move shard operations to rebalance the cluster and +
Computes a set of move shard operations to rebalance the cluster and executes them.
Options for rebalancing the cluster.
const db = new Database();
const result = await db.rebalanceCluster({
moveLeaders: true,
moveFollowers: true
});
// The cluster is now rebalanced.
-Renames the collection collectionName
to newName
.
Renames the collection collectionName
to newName
.
Additionally removes any stored Collection
instance for
collectionName
from the Database
instance's internal cache.
Note: Renaming collections may not be supported when ArangoDB is running in a cluster configuration.
Current name of the collection.
The new name of the collection.
-Renames the view viewName
to newName
.
Renames the view viewName
to newName
.
Additionally removes any stored views.View instance for viewName
from
the Database
instance's internal cache.
Note: Renaming views may not be supported when ArangoDB is running in a cluster configuration.
Current name of the view.
The new name of the view.
-Attempts to renew the authentication token passed to Database#useBearerAuth +
Attempts to renew the authentication token passed to Database#useBearerAuth or returned and used by Database#login. If a new authentication token is issued, it will be used for future requests and returned.
const db = new Database();
await db.login("admin", "hunter2");
// ... later ...
const newToken = await db.renewAuthToken();
if (!newToken) // no new token issued
-Replaces an existing service with a new service by completely removing the +
Replaces an existing service with a new service by completely removing the old service and installing a new service at the same mount point.
The service's mount point, relative to the database.
The service bundle to install.
@@ -830,7 +830,7 @@const
const db = new Database();
// Using a File from a browser file input as source
const element = document.getElementById("my-file-input");
const source = element.files[0];
const info = await db.replaceService("/hello", source);
-Replaces the configuration of the given service, discarding any existing +
Replaces the configuration of the given service, discarding any existing values for options not specified.
See also Database#updateServiceConfiguration and Database#getServiceConfiguration.
@@ -841,7 +841,7 @@const
const db = new Database();
const config = { currency: "USD", locale: "en-US" };
const info = await db.replaceServiceConfiguration("/my-service", config);
for (const [key, option] of Object.entries(info)) {
console.log(`${option.title} (${key}): ${option.value}`);
if (option.warning) console.warn(`Warning: ${option.warning}`);
}
-Replaces the configuration of the given service, discarding any existing +
Replaces the configuration of the given service, discarding any existing values for options not specified.
See also Database#updateServiceConfiguration and Database#getServiceConfiguration.
@@ -852,7 +852,7 @@const
const db = new Database();
const config = { currency: "USD", locale: "en-US" };
const info = await db.replaceServiceConfiguration("/my-service", config);
for (const [key, value] of Object.entries(info.values)) {
console.log(`${key}: ${value}`);
if (info.warnings[key]) console.warn(`Warning: ${info.warnings[key]}`);
}
-Replaces the dependencies of the given service, discarding any existing +
Replaces the dependencies of the given service, discarding any existing mount points for dependencies not specified.
See also Database#updateServiceDependencies and Database#getServiceDependencies.
@@ -863,7 +863,7 @@const
const db = new Database();
const deps = { mailer: "/mailer-api", auth: "/remote-auth" };
const info = await db.replaceServiceDependencies("/my-service", deps);
for (const [key, dep] of Object.entries(info)) {
console.log(`${dep.title} (${key}): ${dep.current}`);
if (dep.warning) console.warn(`Warning: ${dep.warning}`);
}
-Replaces the dependencies of the given service, discarding any existing +
Replaces the dependencies of the given service, discarding any existing mount points for dependencies not specified.
See also Database#updateServiceDependencies and Database#getServiceDependencies.
@@ -874,17 +874,17 @@const
const db = new Database();
const deps = { mailer: "/mailer-api", auth: "/remote-auth" };
const info = await db.replaceServiceDependencies(
"/my-service",
deps,
true
);
for (const [key, value] of Object.entries(info)) {
console.log(`${key}: ${value}`);
if (info.warnings[key]) console.warn(`Warning: ${info.warnings[key]}`);
}
-Replaces the ArangoDB user's option with the new options.
+Replaces the ArangoDB user's option with the new options.
Name of the ArangoDB user to modify.
New options to replace the user's existing options.
const db = new Database();
const user = await db.replaceUser("steve", { passwd: "", active: false });
// The user "steve" has been set to inactive with an empty password
-(Enteprise Edition only.) Restores a consistent local hot backup.
Returns the directory path of the restored backup.
The ID of the backup to restore.
await db.restoreHotBackup("2023-09-19T15.38.21Z_example");
// the backup has been restored
-Returns a new routes.Route instance for the given path (relative to the +
Returns a new routes.Route instance for the given path (relative to the database) that can be used to perform arbitrary HTTP requests.
Optional
path: stringThe database-relative URL of the route. Defaults to the database API root.
@@ -892,7 +892,7 @@const
const db = new Database();
const myFoxxService = db.route("my-foxx-service");
const response = await myFoxxService.post("users", {
username: "admin",
password: "hunter2"
});
// response.body is the result of
// POST /_db/_system/my-foxx-service/users
// with JSON request body '{"username": "admin", "password": "hunter2"}'
-Executes a service script and retrieves its result exposed as
module.exports
(if any).
The service's mount point, relative to the database.
Name of the service script to execute as defined in the @@ -902,7 +902,7 @@
const
const db = new Database();
const result = await db.runServiceScript(
"/my-service",
"create-user",
{
username: "service_admin",
password: "hunter2"
}
);
-Runs the tests of a given service and returns the results using the +
Runs the tests of a given service and returns the results using the "default" reporter.
The service's mount point, relative to the database.
Optional
options: { Options for running the tests.
@@ -912,7 +912,7 @@const
Optional
reporter?: "default"const db = new Database();
const testReport = await db.runServiceTests("/my-foxx");
-Runs the tests of a given service and returns the results using the +
Runs the tests of a given service and returns the results using the "suite" reporter, which groups the test result by test suite.
The service's mount point, relative to the database.
Options for running the tests.
@@ -922,7 +922,7 @@const
const db = new Database();
const suiteReport = await db.runServiceTests(
"/my-foxx",
{ reporter: "suite" }
);
-Runs the tests of a given service and returns the results using the +
Runs the tests of a given service and returns the results using the "stream" reporter, which represents the results as a sequence of tuples representing events.
The service's mount point, relative to the database.
@@ -933,7 +933,7 @@const
const db = new Database();
const streamEvents = await db.runServiceTests(
"/my-foxx",
{ reporter: "stream" }
);
-Runs the tests of a given service and returns the results using the +
Runs the tests of a given service and returns the results using the "tap" reporter, which represents the results as an array of strings using the "tap" format.
The service's mount point, relative to the database.
@@ -944,7 +944,7 @@const
const db = new Database();
const tapLines = await db.runServiceTests(
"/my-foxx",
{ reporter: "tap" }
);
-Runs the tests of a given service and returns the results using the +
Runs the tests of a given service and returns the results using the "xunit" reporter, which represents the results as an XML document using the JSONML exchange format.
The service's mount point, relative to the database.
@@ -955,7 +955,7 @@const
const db = new Database();
const jsonML = await db.runServiceTests(
"/my-foxx",
{ reporter: "xunit" }
);
-Runs the tests of a given service and returns the results as a string +
Runs the tests of a given service and returns the results as a string using the "stream" reporter in "idiomatic" mode, which represents the results as a line-delimited JSON stream of tuples representing events.
The service's mount point, relative to the database.
@@ -967,7 +967,7 @@const
const db = new Database();
const streamReport = await db.runServiceTests(
"/my-foxx",
{ reporter: "stream", idiomatic: true }
);
-Runs the tests of a given service and returns the results as a string +
Runs the tests of a given service and returns the results as a string using the "tap" reporter in "idiomatic" mode, which represents the results using the "tap" format.
The service's mount point, relative to the database.
@@ -979,7 +979,7 @@const
const db = new Database();
const tapReport = await db.runServiceTests(
"/my-foxx",
{ reporter: "tap", idiomatic: true }
);
-Runs the tests of a given service and returns the results as a string +
Runs the tests of a given service and returns the results as a string using the "xunit" reporter in "idiomatic" mode, which represents the results as an XML document.
The service's mount point, relative to the database.
@@ -991,29 +991,29 @@const
const db = new Database();
const xml = await db.runServiceTests(
"/my-foxx",
{ reporter: "xunit", idiomatic: true }
);
-Set a new license for an Enterprise Edition server.
The license as a base 64 encoded string.
If set to true
, the license will be changed even if it
expires sooner than the current license.
Sets the server's log level for each of the given topics to the given level.
+Sets the server's log level for each of the given topics to the given level.
Any omitted topics will be left unchanged.
An object mapping topic names to log levels.
await db.setLogLevel({ request: "debug" });
// Debug information will now be logged for each request
-Updates the global properties for the AQL query results cache.
+Updates the global properties for the AQL query results cache.
The new properties for the AQL query results cache.
const db = new Database();
await db.setQueryCacheProperties({ maxResults: 9000 });
-Sets the limit for the number of values of the most recently received server-reported queue times that can be accessed using Database#queueTime.
Number of values to maintain.
-Enables or disables development mode for the given service.
+Enables or disables development mode for the given service.
The service's mount point, relative to the database.
Whether development mode should be enabled or disabled.
const db = new Database();
await db.setServiceDevelopmentMode("/my-service", true);
// the service is now in development mode
await db.setServiceDevelopmentMode("/my-service", false);
// the service is now in production mode
-Sets the given ArangoDB user's access level for the database, or the +
Sets the given ArangoDB user's access level for the database, or the given collection in the given database.
Name of the ArangoDB user to set the access level for.
Database and/or collection to set the access level for.
@@ -1030,31 +1030,31 @@const
const db = new Database();
const staging = db.database("staging");
await db.setUserAccessLevel("steve", {
collection: staging.collection("pokemons"),
grant: "rw"
});
// The user "steve" now has read-write access to the "pokemons" collection
// in database "staging".
-Fetches information about the server status.
+Fetches information about the server status.
const status = await db.status();
// the status object contains the ArangoDB status information, e.g.
// version: ArangoDB version number
// host: host identifier of the server
// serverInfo: detailed information about the server
-Fetches deployment information about the server for support purposes.
+Fetches deployment information about the server for support purposes.
Note that this API may reveal sensitive data about the deployment.
-Retrives the server's current system time in milliseconds with microsecond +
Returns a transactions.Transaction instance for an existing streaming +
Returns a transactions.Transaction instance for an existing streaming
transaction with the given id
.
See also Database#beginTransaction.
The id
of an existing stream transaction.
const trx1 = await db.beginTransaction(collections);
const id = trx1.id;
// later
const trx2 = db.transaction(id);
await trx2.commit();
-Fetches all active transactions from the database and returns an array of +
Fetches all active transactions from the database and returns an array of transactions.Transaction instances for those transactions.
See also Database#listTransactions.
const db = new Database();
const transactions = await db.transactions();
// transactions is an array of transactions
-Completely removes a service from the database.
The service's mount point, relative to the database.
Optional
options: UninstallServiceOptionsOptions for uninstalling the service.
const db = new Database();
await db.uninstallService("/my-foxx");
-Updates the configuration of the given service while maintaining any +
Updates the configuration of the given service while maintaining any existing values for options not specified.
See also Database#replaceServiceConfiguration and Database#getServiceConfiguration.
@@ -1065,7 +1065,7 @@const
const db = new Database();
const config = { currency: "USD", locale: "en-US" };
const info = await db.updateServiceConfiguration("/my-service", config);
for (const [key, option] of Object.entries(info)) {
console.log(`${option.title} (${key}): ${option.value}`);
if (option.warning) console.warn(`Warning: ${option.warning}`);
}
-Updates the configuration of the given service while maintaining any +
Updates the configuration of the given service while maintaining any existing values for options not specified.
See also Database#replaceServiceConfiguration and Database#getServiceConfiguration.
@@ -1076,7 +1076,7 @@const
const db = new Database();
const config = { currency: "USD", locale: "en-US" };
const info = await db.updateServiceConfiguration("/my-service", config);
for (const [key, value] of Object.entries(info.values)) {
console.log(`${key}: ${value}`);
if (info.warnings[key]) console.warn(`Warning: ${info.warnings[key]}`);
}
-Updates the dependencies of the given service while maintaining any +
Updates the dependencies of the given service while maintaining any existing mount points for dependencies not specified.
See also Database#replaceServiceDependencies and Database#getServiceDependencies.
@@ -1087,7 +1087,7 @@const
const db = new Database();
const deps = { mailer: "/mailer-api", auth: "/remote-auth" };
const info = await db.updateServiceDependencies("/my-service", deps);
for (const [key, dep] of Object.entries(info)) {
console.log(`${dep.title} (${key}): ${dep.current}`);
if (dep.warning) console.warn(`Warning: ${dep.warning}`);
}
-Updates the dependencies of the given service while maintaining any +
Updates the dependencies of the given service while maintaining any existing mount points for dependencies not specified.
See also Database#replaceServiceDependencies and Database#getServiceDependencies.
@@ -1098,17 +1098,17 @@const
const db = new Database();
const deps = { mailer: "/mailer-api", auth: "/remote-auth" };
const info = await db.updateServiceDependencies(
"/my-service",
deps,
true
);
for (const [key, value] of Object.entries(info)) {
console.log(`${key}: ${value}`);
if (info.warnings[key]) console.warn(`Warning: ${info.warnings[key]}`);
}
-Sets the password of a given ArangoDB user to the new value.
+Sets the password of a given ArangoDB user to the new value.
Name of the ArangoDB user to change the password for.
New password for the ArangoDB user.
const db = new Database();
const user = await db.updateUser("steve", "hunter2");
// The user "steve" has received a new password
-Updates the ArangoDB user with the new options.
+Updates the ArangoDB user with the new options.
Name of the ArangoDB user to modify.
Options of the ArangoDB user to modify.
const db = new Database();
const user = await db.updateUser("steve", { active: false });
// The user "steve" has been set to inactive
-Replaces an existing service with a new service while retaining the old +
Replaces an existing service with a new service while retaining the old service's configuration and dependencies.
The service's mount point, relative to the database.
The service bundle to install.
@@ -1119,40 +1119,40 @@const
const db = new Database();
// Using a File from a browser file input as source
const element = document.getElementById("my-file-input");
const source = element.files[0];
const info = await db.upgradeService("/hello", source);
-Updates the underlying connection's authorization
header to use Basic
authentication with the given username
and password
, then returns
itself.
The username to authenticate with.
The password to authenticate with.
const db = new Database();
db.useBasicAuth("admin", "hunter2");
// with the username "admin" and password "hunter2".
-Updates the underlying connection's authorization
header to use Bearer
authentication with the given authentication token
, then returns itself.
The token to authenticate with.
const db = new Database();
db.useBearerAuth("keyboardcat");
// The database instance now uses Bearer authentication.
-Fetches all databases accessible to the active user from the server and +
Fetches all databases accessible to the active user from the server and
returns an array of Database
instances for those databases.
See also Database#listUserDatabases and Database#databases.
const db = new Database();
const names = await db.userDatabases();
// databases is an array of databases
-Fetches version information from the ArangoDB server.
+Fetches version information from the ArangoDB server.
Optional
details: booleanIf set to true
, additional information about the
ArangoDB server will be available as the details
property.
const db = new Database();
const version = await db.version();
// the version object contains the ArangoDB version information.
// license: "community" or "enterprise"
// version: ArangoDB version number
// server: description of the server
-Returns a views.View instance for the given viewName
.
Returns a views.View instance for the given viewName
.
Name of the ArangoSearch or SearchAlias View.
const db = new Database();
const view = db.view("potatoes");
-Fetches all Views from the database and returns an array of +
Fetches all Views from the database and returns an array of views.View instances for the Views.
See also Database#listViews.
const db = new Database();
const views = await db.views();
// views is an array of ArangoSearch View instances
-Performs a request against every known coordinator and returns when the request has succeeded against every coordinator or the timeout is reached.
Note: This method is primarily intended to make database setup easier in cluster scenarios and requires all coordinators to be known to arangojs @@ -1162,7 +1162,7 @@
constOptional
timeout: numberMaximum number of milliseconds to wait for propagation.
const db = new Database({ loadBalancingStrategy: "ROUND_ROBIN" });
await system.acquireHostList();
const analyzer = db.analyzer("my-analyzer");
await analyzer.create();
await db.waitForPropagation(
{ pathname: `/_api/analyzer/${encodeURIComponent(analyzer.name)}` },
30000
);
// Analyzer has been propagated to all coordinators and can safely be used
-Begins and commits a transaction using the given callback. Individual requests that are part of the transaction need to be wrapped in the step function passed into the callback. If the promise returned by the callback is rejected, the transaction will be aborted.
@@ -1211,7 +1211,7 @@// WORSE: Call
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const edges = db.collection("edges");
await db.withTransaction(
{
read: ["vertices"],
write: [edges] // collection instances can be passed directly
},
async (step) => {
const start = await step(() => vertices.document("a"));
const end = await step(() => vertices.document("b"));
await step(() => edges.save({ _from: start._id, _to: end._id }));
}
);
-Begins and commits a transaction using the given callback. Individual +
Begins and commits a transaction using the given callback. Individual requests that are part of the transaction need to be wrapped in the step function passed into the callback. If the promise returned by the callback is rejected, the transaction will be aborted.
@@ -1260,7 +1260,7 @@// WORSE: Call
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const edges = db.collection("edges");
await db.withTransaction(
[
"vertices",
edges, // collection instances can be passed directly
],
async (step) => {
const start = await step(() => vertices.document("a"));
const end = await step(() => vertices.document("b"));
await step(() => edges.save({ _from: start._id, _to: end._id }));
}
);
-Begins and commits a transaction using the given callback. Individual +
Begins and commits a transaction using the given callback. Individual requests that are part of the transaction need to be wrapped in the step function passed into the callback. If the promise returned by the callback is rejected, the transaction will be aborted.
@@ -1309,4 +1309,4 @@// WORSE: Call
Optional
options: TransactionOptionsOptions for the transaction.
const vertices = db.collection("vertices");
const start = vertices.document("a");
const end = vertices.document("b");
const edges = db.collection("edges");
await db.withTransaction(
edges, // collection instances can be passed directly
async (step) => {
await step(() => edges.save({ _from: start._id, _to: end._id }));
}
);
-Represents an error returned by ArangoDB.
-Represents an error returned by ArangoDB.
+Creates a new ArangoError
from an ArangoDB error response.
Optional
cause?: ErrorOptional
isOptional
codeHTTP status code included in the server error response object.
-ArangoDB error code.
+Optional
cause?: ErrorOptional
isOptional
codeHTTP status code included in the server error response object.
+ArangoDB error code.
-Static
Optional
prepareOptional override for formatting stack traces
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackError message accompanying the error code.
-Fetch request object.
-Server response object.
-Static
captureStatic
stackError message accompanying the error code.
+Fetch request object.
+Server response object.
+Static
captureRepresents an error from a failed fetch request.
+Represents an error from a failed fetch request.
The root cause is often extremely difficult to determine.
-Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
-Fetch request object.
-Static
Optional
prepareOptional override for formatting stack traces
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
+Fetch request object.
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents a plain HTTP error response.
-Represents a plain HTTP error response.
+HTTP status code of the server response.
-Indicates whether the request that caused this error can be safely retried.
-Fetch request object.
-Server response object.
-Static
Optional
prepareOptional override for formatting stack traces
+Indicates whether the request that caused this error can be safely retried.
+Fetch request object.
+Server response object.
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents a network error or an error encountered while performing a network request.
-Represents a network error or an error encountered while performing a network request.
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
-Fetch request object.
-Static
Optional
prepareOptional override for formatting stack traces
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
+Fetch request object.
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents an error from a deliberate timeout encountered while waiting +
Represents an error from a deliberate timeout encountered while waiting for propagation.
-Optional
message: stringOptional
cause?: ErrorStatic
Optional
prepareOptional override for formatting stack traces
+Optional
message: stringOptional
cause?: ErrorStatic
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents an error from a request that was aborted.
-Represents an error from a request that was aborted.
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
-Fetch request object.
-Static
Optional
prepareOptional override for formatting stack traces
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
+Fetch request object.
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents an error from a deliberate timeout encountered while waiting +
Represents an error from a deliberate timeout encountered while waiting for a server response.
-Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
-Fetch request object.
-Static
Optional
prepareOptional override for formatting stack traces
+Optional
cause?: ErrorOptional
isIndicates whether the request that caused this error can be safely retried.
+Fetch request object.
+Static
Optional
prepareOptional override for formatting stack traces
Static
stackStatic
captureStatic
stackStatic
captureRepresents a graph in a databases.Database.
-Represents a graph in a databases.Database.
+Indicates that this object represents an ArangoDB Graph.
-Name of the graph.
-Adds an edge definition to this graph.
+Indicates that this object represents an ArangoDB Graph.
+Name of the graph.
+Adds an edge definition to this graph.
Definition of a relation in this graph.
const db = new Database();
const graph = db.graph("some-graph");
await graph.addEdgeDefinition({
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
});
// The edge definition has been added to the graph
-Adds the given collection to this graph as a vertex collection.
+Adds the given collection to this graph as a vertex collection.
Collection to add to the graph.
const db = new Database();
const graph = db.graph("some-graph");
await graph.addVertexCollection("more-vertices");
// The collection "more-vertices" has been added to the graph
const extra = db.collection("extra-vertices");
await graph.addVertexCollection(extra);
// The collection "extra-vertices" has been added to the graph
-Creates a graph with the given edgeDefinitions
and options
for this
+
Creates a graph with the given edgeDefinitions
and options
for this
graph's name.
Definitions for the relations of the graph.
Options for creating the graph.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
// graph now exists
-Deletes the graph from the database.
If set to true
, the collections associated with
the graph will also be deleted.
const db = new Database();
const graph = db.graph("some-graph");
await graph.drop();
// the graph "some-graph" no longer exists
-Returns a GraphEdgeCollection instance for the given collection +
Returns a GraphEdgeCollection instance for the given collection name representing the collection in this graph.
Name of the edge collection.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
const graphEdgeCollection = graph.edgeCollection("edges");
// Access the underlying EdgeCollection API:
const edgeCollection = graphEdgeCollection.collection;
-Fetches all edge collections of this graph from the database and returns +
Fetches all edge collections of this graph from the database and returns an array of GraphEdgeCollection instances.
See also Graph#listEdgeCollections.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
const graphEdgeCollections = await graph.edgeCollections();
for (const collection of graphEdgeCollection) {
console.log(collection.name);
// "edges"
}
-Retrieves general information about the graph.
+Retrieves general information about the graph.
const db = new Database();
const graph = db.graph("some-graph");
const data = await graph.get();
// data contains general information about the graph
-Fetches all edge collections of this graph from the database and returns an array of their names.
See also Graph#edgeCollections.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
const edgeCollectionNames = await graph.listEdgeCollections();
// ["edges"]
-Fetches all vertex collections of this graph from the database and returns an array of their names.
See also Graph#vertexCollections.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
const vertexCollectionNames = await graph.listVertexCollections();
// ["start-vertices", "end-vertices"]
-Removes the edge definition for the given edge collection from this graph.
+Removes the edge definition for the given edge collection from this graph.
Edge collection for which to remove the definition.
If set to true
, the collection will also be
deleted from the database.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
await graph.removeEdgeDefinition("edges");
// The edge definition for "edges" has been replaced
-Removes the given collection from this graph as a vertex collection.
+Removes the given collection from this graph as a vertex collection.
Collection to remove from the graph.
If set to true
, the collection will also be
deleted from the database.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
await graph.removeVertexCollection("start-vertices");
// The collection "start-vertices" is no longer part of the graph.
-Replaces an edge definition in this graph. The existing edge definition +
Replaces an edge definition in this graph. The existing edge definition for the given edge collection will be overwritten.
Definition of a relation in this graph.
Optional
options: ReplaceEdgeDefinitionOptionsconst db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
await graph.replaceEdgeDefinition({
collection: "edges",
from: ["start-vertices"],
to: ["other-vertices"],
});
// The edge definition for "edges" has been replaced
-Replaces an edge definition in this graph. The existing edge definition +
Replaces an edge definition in this graph. The existing edge definition for the given edge collection will be overwritten.
Edge collection for which to replace the definition.
Definition of a relation in this graph.
Optional
options: ReplaceEdgeDefinitionOptionsconst db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
await graph.replaceEdgeDefinition("edges", {
collection: "edges",
from: ["start-vertices"],
to: ["other-vertices"],
});
// The edge definition for "edges" has been replaced
-Returns a GraphVertexCollection instance for the given collection +
Returns a GraphVertexCollection instance for the given collection name representing the collection in this graph.
Name of the vertex collection.
-Fetches all vertex collections of this graph from the database and returns +
Fetches all vertex collections of this graph from the database and returns an array of GraphVertexCollection instances.
See also Graph#listVertexCollections.
const db = new Database();
const graph = db.graph("some-graph");
const info = await graph.create([
{
collection: "edges",
from: ["start-vertices"],
to: ["end-vertices"],
},
]);
const vertexCollections = await graph.vertexCollections();
for (const vertexCollection of vertexCollections) {
console.log(vertexCollection.name);
// "start-vertices"
// "end-vertices"
}
-Represents a collections.EdgeCollection of edges in a Graph.
+Represents a collections.EdgeCollection of edges in a Graph.
Type to represent edge document contents returned by the server (including computed properties).
Type to represent edge document contents passed when inserting or replacing edge documents (without computed properties).
-A collections.EdgeCollection instance for this edge collection.
-Name of the collection.
-Retrieves the edge matching the given key or id.
+Name of the collection.
+Retrieves the edge matching the given key or id.
Throws an exception when passed a edge or _id
from a different
collection, or if the edge does not exist.
Document _key
, _id
or object with either of those
@@ -27,7 +27,7 @@
const graph = db.graph("some-graph");
const collection = graph.edgeCollection("friends")
const edge = await collection.edge("abc123", { graceful: true });
if (edge) {
console.log(edge);
} else {
console.error("Edge does not exist");
}
-Retrieves the edge matching the given key or id.
+Retrieves the edge matching the given key or id.
Throws an exception when passed a edge or _id
from a different
collection, or if the edge does not exist.
Document _key
, _id
or object with either of those
@@ -38,7 +38,7 @@
const
const graph = db.graph("some-graph");
const collection = graph.edgeCollection("friends")
const edge = await collection.edge("abc123", true);
if (edge) {
console.log(edge);
} else {
console.error("Edge does not exist");
}
-const graph = db.graph("some-graph");
const collection = graph.edgeCollection("friends")
const exists = await collection.edgeExists("abc123");
if (!exists) {
console.log("Edge does not exist");
}
-Removes an existing edge from the collection.
+Removes an existing edge from the collection.
Throws an exception when passed a edge or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -54,7 +54,7 @@
constOptional
options: RemoveGraphDocumentOptionsOptions for removing the edge.
const db = new Database();
const collection = db.collection("friends");
const doc = await collection.edge("musadir");
await collection.remove(doc);
// edge with key "musadir" deleted
-Replaces an existing edge in the collection.
+Replaces an existing edge in the collection.
Throws an exception when passed a edge or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -63,12 +63,12 @@
constOptional
options: ReplaceGraphDocumentOptionsOptions for replacing the edge.
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
const result = await collection.replace(
"musadir",
{ active: false },
{ returnNew: true }
);
console.log(result.new.active, result.new.best); // false undefined
-Inserts a new edge with the given data
into the collection.
Inserts a new edge with the given data
into the collection.
The contents of the new edge.
Optional
options: InsertGraphDocumentOptionsOptions for inserting the edge.
const db = new Database();
const collection = db.collection("friends");
const result = await collection.save(
{ _from: "users/rana", _to: "users/mudasir", active: false },
{ returnNew: true }
);
-Updates an existing edge in the collection.
+Updates an existing edge in the collection.
Throws an exception when passed a edge or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -77,4 +77,4 @@
constOptional
options: ReplaceGraphDocumentOptionsOptions for updating the edge.
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
const result = await collection.update(
"musadir",
{ active: false },
{ returnNew: true }
);
console.log(result.new.active, result.new.best); // false true
-Represents a collections.DocumentCollection of vertices in a Graph.
+Represents a collections.DocumentCollection of vertices in a Graph.
Type to represent vertex document contents returned by the server (including computed properties).
Type to represent vertex document contents passed when inserting or replacing vertex documents (without computed properties).
-A collections.DocumentCollection instance for this vertex collection.
-Name of the collection.
-Removes an existing vertex from the collection.
+Name of the collection.
+Removes an existing vertex from the collection.
Throws an exception when passed a vertex or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -27,7 +27,7 @@
const graph = db.graph("some-graph");
const collection = graph.vertexCollection("vertices");
const doc = await collection.vertex("abc123");
await collection.remove(doc);
// document with key "abc123" deleted
-Replaces an existing vertex in the collection.
+Replaces an existing vertex in the collection.
Throws an exception when passed a vertex or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -36,12 +36,12 @@
constOptional
options: ReplaceGraphDocumentOptionsOptions for replacing the vertex.
const graph = db.graph("some-graph");
const collection = graph.collection("vertices");
await collection.save({ _key: "a", color: "blue", count: 1 });
const result = await collection.replace(
"a",
{ color: "red" },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "red" undefined
-Inserts a new vertex with the given data
into the collection.
Inserts a new vertex with the given data
into the collection.
The contents of the new vertex.
Optional
options: InsertGraphDocumentOptionsOptions for inserting the vertex.
const graph = db.graph("some-graph");
const collection = graph.vertexCollection("friends");
const result = await collection.save(
{ _key: "a", color: "blue", count: 1 },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "blue" 1
-Updates an existing vertex in the collection.
+Updates an existing vertex in the collection.
Throws an exception when passed a vertex or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -50,7 +50,7 @@
constOptional
options: ReplaceGraphDocumentOptionsOptions for updating the vertex.
const graph = db.graph("some-graph");
const collection = graph.collection("vertices");
await collection.save({ _key: "a", color: "blue", count: 1 });
const result = await collection.update(
"a",
{ count: 2 },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "blue" 2
-Retrieves the vertex matching the given key or id.
+Retrieves the vertex matching the given key or id.
Throws an exception when passed a vertex or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -60,7 +60,7 @@
const
const graph = db.graph("some-graph");
const collection = graph.vertexCollection("vertices");
const vertex = await collection.vertex("abc123", { graceful: true });
if (vertex) {
console.log(vertex);
} else {
console.error("Could not find vertex");
}
-Retrieves the vertex matching the given key or id.
+Retrieves the vertex matching the given key or id.
Throws an exception when passed a vertex or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -71,7 +71,7 @@
const
const graph = db.graph("some-graph");
const collection = graph.vertexCollection("vertices");
const vertex = await collection.vertex("abc123", true);
if (vertex) {
console.log(vertex);
} else {
console.error("Could not find vertex");
}
-const graph = db.graph("some-graph");
const collection = graph.vertexCollection("vertices");
const exists = await collection.vertexExists("abc123");
if (!exists) {
console.log("Vertex does not exist");
}
-Represents an async job in a databases.Database.
+Represents an async job in a databases.Database.
The job's ID.
-Whether the job's results have been loaded. If set to true
, the job's
+
The job's ID.
+Whether the job's results have been loaded. If set to true
, the job's
result can be accessed from Job.result.
The job's result if it has been loaded or undefined
otherwise.
The job's result if it has been loaded or undefined
otherwise.
Fetches the job's completion state.
Returns true
if the job has completed, false
otherwise.
// poll for the job to complete
while (!(await job.getCompleted())) {
await timeout(1000);
}
// job result is now available and can be loaded
await job.load();
console.log(job.result);
-Loads the job's result from the database if it is not already loaded.
+Loads the job's result from the database if it is not already loaded.
// poll for the job to complete
while (!job.isLoaded) {
await timeout(1000);
const result = await job.load();
console.log(result);
}
// job result is now loaded and can also be accessed from job.result
console.log(job.result);
-Represents an arbitrary route relative to an ArangoDB database.
-Represents an arbitrary route relative to an ArangoDB database.
+Headers of this route.
-Path of this route.
-Performs a DELETE request against the given path relative to this route +
Headers of this route.
+Path of this route.
+Performs a DELETE request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.delete("/users/admin");
-Performs a DELETE request against the given path relative to this route +
Performs a DELETE request against the given path relative to this route and returns the server response.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const user = foxx.roue("/users/admin");
const res = await user.delete();
-Performs a GET request against the given path relative to this route +
Performs a GET request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.get("/users", { offset: 10, limit: 5 });
-Performs a GET request against the given path relative to this route +
Performs a GET request against the given path relative to this route and returns the server response.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const users = foxx.route("/users");
const res = await users.get({ offset: 10, limit: 5 });
-Performs a HEAD request against the given path relative to this route +
Performs a HEAD request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.head("/users", { offset: 10, limit: 5 });
-Performs a HEAD request against the given path relative to this route +
Performs a HEAD request against the given path relative to this route and returns the server response.
Optional
search: Record<string, any> | URLSearchParamsQuery string parameters for this request.
Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const users = foxx.route("/users");
const res = await users.head({ offset: 10, limit: 5 });
-Performs a PATCH request against the given path relative to this route +
Performs a PATCH request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
body: anyBody of the request object.
@@ -60,7 +60,7 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.patch("/users/admin", { password: "admin" });
-Performs a PATCH request against the given path relative to this route +
Performs a PATCH request against the given path relative to this route and returns the server response.
Note: body
must not be a string
.
Optional
body: anyBody of the request object. Must not be a string.
@@ -68,7 +68,7 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const user = foxx.route("/users/admin")
const res = await user.patch({ password: "admin" });
-Performs a POST request against the given path relative to this route +
Performs a POST request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
body: anyBody of the request object.
@@ -76,7 +76,7 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.post("/users", {
username: "admin",
password: "hunter2"
});
-Performs a POST request against the given path relative to this route +
Performs a POST request against the given path relative to this route and returns the server response.
Note: body
must not be a string
.
Optional
body: anyBody of the request object. Must not be a string.
@@ -84,7 +84,7 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const users = foxx.route("/users");
const res = await users.post({
username: "admin",
password: "hunter2"
});
-Performs a PUT request against the given path relative to this route +
Performs a PUT request against the given path relative to this route and returns the server response.
Path relative to this route.
Optional
body: anyBody of the request object.
@@ -92,7 +92,7 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.put("/users/admin/password", { password: "admin" });
-Performs a PUT request against the given path relative to this route +
Performs a PUT request against the given path relative to this route and returns the server response.
Note: body
must not be a string
.
Optional
body: anyBody of the request object. Must not be a string.
@@ -100,15 +100,15 @@Optional
headers: Record<string, string> | HeadersAdditional headers to send with this request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const password = foxx.route("/users/admin/password");
const res = await password.put({ password: "admin" });
-Performs an arbitrary HTTP request relative to this route and returns the +
Performs an arbitrary HTTP request relative to this route and returns the server response.
Options for performing the request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const res = await foxx.request({
method: "POST",
pathname: "/users",
body: {
username: "admin",
password: "hunter2"
}
});
-Creates a new route relative to this route that inherits any of its default +
Creates a new route relative to this route that inherits any of its default HTTP headers.
Path relative to this route.
Optional
headers: Record<string, string> | HeadersAdditional headers that will be sent with each request.
const db = new Database();
const foxx = db.route("/my-foxx-service");
const users = foxx.route("/users");
-Represents a streaming transaction in a databases.Database.
-Represents a streaming transaction in a databases.Database.
+Unique identifier of this transaction.
+Unique identifier of this transaction.
-Attempts to abort the transaction to the databases.
+Attempts to abort the transaction to the databases.
Options for aborting the transaction.
const db = new Database();
const col = db.collection("some-collection");
const trx = db.beginTransaction(col);
await trx.step(() => col.save({ hello: "world" }));
const result = await trx.abort();
// result indicates the updated transaction status
-Attempts to commit the transaction to the databases.
+Attempts to commit the transaction to the databases.
Options for comitting the transaction.
const db = new Database();
const col = db.collection("some-collection");
const trx = db.beginTransaction(col);
await trx.step(() => col.save({ hello: "world" }));
const result = await trx.commit();
// result indicates the updated transaction status
-Retrieves general information about the transaction.
+Retrieves general information about the transaction.
const db = new Database();
const col = db.collection("some-collection");
const trx = db.beginTransaction(col);
await trx.step(() => col.save({ hello: "world" }));
const info = await trx.get();
// the transaction exists
-Executes the given function locally as a single step of the transaction.
Callback function returning a promise.
Warning: The callback function should wrap a single call of an async @@ -58,4 +58,4 @@
// BAD! You ca
// WORSE: Calls to non-async arangojs methods don't need to be performed
// as part of a transaction
const collection = await trx.step(() => db.collection("my-documents"));
// BETTER: If an arangojs method is not async and doesn't return promises,
// call it without `trx.step`
const collection = db.collection("my-documents");
-Represents a View in a databases.Database.
-Represents a View in a databases.Database.
+Name of the View.
-Creates a View with the given options
and the instance's name.
Name of the View.
+Creates a View with the given options
and the instance's name.
See also databases.Database#createView.
const db = new Database();
const view = db.view("potatoes");
await view.create();
// the ArangoSearch View "potatoes" now exists
-Retrieves general information about the View.
+Retrieves general information about the View.
const db = new Database();
const view = db.view("some-view");
const data = await view.get();
// data contains general information about the View
-Retrieves the View's properties.
+Retrieves the View's properties.
const db = new Database();
const view = db.view("some-view");
const data = await view.properties();
// data contains the View's properties
-Renames the View and updates the instance's name
to newName
.
Renames the View and updates the instance's name
to newName
.
Additionally removes the instance from the databases.Database's internal cache.
Note: Renaming Views may not be supported when ArangoDB is @@ -35,12 +35,12 @@
The new name of the View.
const db = new Database();
const view1 = db.view("some-view");
await view1.rename("other-view");
const view2 = db.view("some-view");
const view3 = db.view("other-view");
// Note all three View instances are different objects but
// view1 and view3 represent the same ArangoDB view!
-Replaces the properties of the View.
+Replaces the properties of the View.
Optional
properties: PropertiesNew properties of the View.
const db = new Database();
const view = db.view("some-view");
const result = await view.replaceProperties({
consolidationIntervalMsec: 234
});
console.log(result.consolidationIntervalMsec); // 234
-Updates the properties of the View.
+Updates the properties of the View.
Optional
properties: PropertiesProperties of the View to update.
const db = new Database();
const view = db.view("some-view");
const result = await view.updateProperties({
consolidationIntervalMsec: 234
});
console.log(result.consolidationIntervalMsec); // 234
-Integer values indicating the collection loading status.
-Integer values indicating the collection type.
-Template string handler (template tag) for AQL queries.
+Template string handler (template tag) for AQL queries.
The aql
tag can be used to write complex AQL queries as multi-line strings
without having to worry about bindVars
and the distinction between
collections and regular parameters.
const
const collection = db.collection("some-collection");
const color = "green";
const filter = aql`FILTER d.color == ${color}'`;
const result = await db.query(aql`
FOR d IN ${collection}
${filter}
RETURN d
`);
-Indicates whether the given value is an AqlLiteral.
+Indicates whether the given value is an AqlLiteral.
A value that might be an AqlLiteral
.
Constructs AqlQuery objects from an array of arbitrary values.
+Constructs AqlQuery objects from an array of arbitrary values.
Note: Nesting aql
template strings is a much safer alternative
for most use cases. This low-level helper function only exists to
complement the aql
tag when constructing complex queries from dynamic
@@ -12,4 +12,4 @@
const users = db.collection("users");
const keys = ["jreyes", "ghermann"];
// BAD! NEEDLESSLY COMPLEX!
const docs = keys.map(key => aql`DOCUMENT(${users}, ${key}`));
const result = await db.query(aql`
FOR user IN [
${join(docs, ", ")}
]
RETURN user
`);
// Query:
// FOR user IN [
// DOCUMENT(@@value0, @value1), DOCUMENT(@@value0, @value2)
// ]
// RETURN user
// Bind parameters:
// @value0 -> "users"
// value1 -> "jreyes"
// value2 -> "ghermann"
// GOOD! MUCH SIMPLER!
const result = await db.query(aql`
FOR key IN ${keys}
LET user = DOCUMENT(${users}, key)
RETURN user
`);
// Query:
// FOR user IN @value0
// LET user = DOCUMENT(@@value1, key)
// RETURN user
// Bind parameters:
// value0 -> ["jreyes", "ghermann"]
// @value1 -> "users"
-Marks an arbitrary scalar value (i.e. a string, number or boolean) as +
Marks an arbitrary scalar value (i.e. a string, number or boolean) as
safe for being inlined directly into AQL queries when used in an aql
template string, rather than being converted into a bind parameter.
Note: Nesting aql
template strings is a much safer alternative for
@@ -12,4 +12,4 @@
// BAD! DO NOT
// WARNING: We explicitly trust the environment variable to be safe!
const filter = literal(process.env.FILTER_STATEMENT);
const users = await db.query(aql`
FOR user IN users
${filter}
RETURN user
`);
-Coerces the given collection name or ArangoCollection object to +
Coerces the given collection name or ArangoCollection object to a string representing the collection name.
Collection name or ArangoCollection object.
-Indicates whether the given value represents an ArangoCollection.
+Indicates whether the given value represents an ArangoCollection.
A value that might be a collection.
-Determines if the given credentials are for Bearer token authentication.
-Determines if the given credentials are for Bearer token authentication.
+Returns the status message for the given response's status code or the +
Returns the status message for the given response's status code or the status text of the response.
-Indicates whether the given value represents an ArangoDB error response.
-Indicates whether the given value represents an ArangoDB error response.
+Indicates whether the given value represents an ArangoError.
+Indicates whether the given value represents an ArangoError.
A value that might be an ArangoError
.
Indicates whether the given value represents a NetworkError.
+Indicates whether the given value represents a NetworkError.
A value that might be a NetworkError
.
Creates a new Database
instance with its own connection pool.
Creates a new Database
instance with its own connection pool.
This is a wrapper function for the :constructor.
Optional
config: ConfigOptionsAn object with configuration options.
const db = arangojs({
url: "http://127.0.0.1:8529",
databaseName: "myDatabase",
auth: { username: "admin", password: "hunter2" },
});
-Creates a new Database
instance with its own connection pool.
Creates a new Database
instance with its own connection pool.
This is a wrapper function for the :constructor.
Base URL of the ArangoDB server or list of server URLs.
Equivalent to the url
option in configuration.ConfigOptions.
Optional
name: stringconst db = arangojs("http://127.0.0.1:8529", "myDatabase");
db.useBasicAuth("admin", "hunter2");
-Indicates whether the given value represents a Transaction.
+Indicates whether the given value represents a Transaction.
A value that might be a transaction.
-The official ArangoDB JavaScript client for Node.js and the browser.
+The official ArangoDB JavaScript client for Node.js and the browser.
diff --git a/devel/interfaces/administration.QueueTimeMetrics.html b/devel/interfaces/administration.QueueTimeMetrics.html index c68e547c9..8c0b3410a 100644 --- a/devel/interfaces/administration.QueueTimeMetrics.html +++ b/devel/interfaces/administration.QueueTimeMetrics.html @@ -1,12 +1,12 @@ -An object providing methods for accessing queue time metrics of the most +
An object providing methods for accessing queue time metrics of the most recently received server responses if the server supports this feature.
-An object representing a trusted AQL literal that will be inlined directly +
An object representing a trusted AQL literal that will be inlined directly when used in an AQL template or passed to AQL helper functions.
Arbitrary values can be converted to trusted AQL literals by passing them to the literal helper function.
-Generic AQL query object consisting of an AQL query string and its bind +
Generic AQL query object consisting of an AQL query string and its bind parameters.
-Optional
[type]An object mapping AQL bind parameter names to their respective values.
Names of parameters representing collections are prefixed with an at-symbol.
-An AQL query string.
-An AQL query string.
+Derived type representing AQL query objects generated by the AQL helper +
Derived type representing AQL query objects generated by the AQL helper functions and the AQL template string handler. These objects can be fed back into these helper functions to be inlined or merged in complex queries.
-Optional
[type]An object mapping AQL bind parameter names to their respective values.
Names of parameters representing collections are prefixed with an at-symbol.
-An AQL query string.
-An AQL query string.
+A marker interface identifying objects that can be used in AQL template +
A marker interface identifying objects that can be used in AQL template strings to create references to ArangoDB collections.
See aql.aql.
-Represents an document collection in a databases.Database.
+Represents an document collection in a databases.Database.
See EdgeCollection for a variant of this interface more suited for edge collections.
When using TypeScript, collections can be cast to a specific document data @@ -9,7 +9,7 @@ server (including computed properties).
Type to represent document contents passed when inserting or replacing documents (without computed properties).
-Readonly
databaseDatabase this collection belongs to.
-Readonly
nameName of the collection.
-Retrieves the collection checksum.
+Readonly
nameName of the collection.
+Retrieves the collection checksum.
Optional
options: CollectionChecksumOptionsOptions for retrieving the checksum.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.checksum();
// data contains the collection's checksum
-Triggers compaction for a collection.
+Triggers compaction for a collection.
const db = new Database();
const collection = db.collection("some-collection");
await collection.compact();
// Background compaction is triggered on the collection
-Retrieves information about the number of documents in a collection.
+Retrieves information about the number of documents in a collection.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.count();
// data contains the collection's count
-Creates a collection with the given options
and the instance's name.
Creates a collection with the given options
and the instance's name.
See also databases.Database#createCollection and databases.Database#createEdgeCollection.
Note: When called on an EdgeCollection instance in TypeScript, @@ -70,7 +70,7 @@
const
interface Friend {
startDate: number;
endDate?: number;
}
const db = new Database();
const collection = db.collection("friends") as EdgeCollection<Friend>;
// even in TypeScript you still need to indicate the collection type
// if you want to create an edge collection
await collection.create({ type: CollectionType.EDGE_COLLECTION });
// the edge collection "friends" now exists
-Retrieves the document matching the given key or id.
+Retrieves the document matching the given key or id.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -80,7 +80,7 @@
interface
const db = new Database();
const collection = db.collection("some-collection");
const document = await collection.document("abc123", { graceful: true });
if (document) {
console.log(document);
} else {
console.error("Could not find document");
}
-Retrieves the document matching the given key or id.
+Retrieves the document matching the given key or id.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -91,7 +91,7 @@
const
const db = new Database();
const collection = db.collection("some-collection");
const document = await collection.document("abc123", true);
if (document) {
console.log(document);
} else {
console.error("Could not find document");
}
-Checks whether a document matching the given key or id exists in this collection.
Throws an exception when passed a document or _id
from a different
collection.
const
Optional
options: DocumentExistsOptionsconst db = new Database();
const collection = db.collection("some-collection");
const exists = await collection.documentExists("abc123");
if (!exists) {
console.log("Document does not exist");
}
-Derives a document _id
from the given selector for this collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -108,7 +108,7 @@
const
const db = new Database();
const collection1 = db.collection("some-collection");
const collection2 = db.collection("other-collection");
const meta = await collection1.save({ foo: "bar" });
// Mixing collections is usually a mistake
console.log(collection1.documentId(meta)); // ok: same collection
console.log(collection2.documentId(meta)); // throws: wrong collection
console.log(collection2.documentId(meta._id)); // also throws
console.log(collection2.documentId(meta._key)); // ok but wrong collection
-Retrieves the documents matching the given key or id values.
+Retrieves the documents matching the given key or id values.
Throws an exception when passed a document or _id
from a different
collection, or if the document does not exist.
Array of document _key
, _id
or objects with either
@@ -116,83 +116,83 @@
constOptional
options: BulkReadDocumentsOptionsOptions for retrieving the documents.
const db = new Database();
const collection = db.collection("some-collection");
try {
const documents = await collection.documents(["abc123", "xyz456"]);
console.log(documents);
} catch (e: any) {
console.error("Could not find document");
}
-Deletes the collection from the database.
+Deletes the collection from the database.
Optional
options: DropCollectionOptionsOptions for dropping the collection.
const db = new Database();
const collection = db.collection("some-collection");
await collection.drop();
// The collection "some-collection" is now an ex-collection
-Deletes the index with the given name or id
from the database.
Deletes the index with the given name or id
from the database.
Index name, id or object with either property.
const db = new Database();
const collection = db.collection("some-collection");
await collection.dropIndex("some-index");
// The index "some-index" no longer exists
-Creates a persistent index on the collection if it does not already exist.
+Creates a persistent index on the collection if it does not already exist.
Options for creating the persistent index.
const db = new Database();
const collection = db.collection("some-collection");
// Create a unique index for looking up documents by username
await collection.ensureIndex({
type: "persistent",
fields: ["username"],
name: "unique-usernames",
unique: true
});
-Creates a TTL index on the collection if it does not already exist.
+Creates a TTL index on the collection if it does not already exist.
Options for creating the TTL index.
const db = new Database();
const collection = db.collection("some-collection");
// Expire documents with "createdAt" timestamp one day after creation
await collection.ensureIndex({
type: "ttl",
fields: ["createdAt"],
expireAfter: 60 * 60 * 24 // 24 hours
});
const db = new Database();
const collection = db.collection("some-collection");
// Expire documents with "expiresAt" timestamp according to their value
await collection.ensureIndex({
type: "ttl",
fields: ["expiresAt"],
expireAfter: 0 // when attribute value is exceeded
});
-Creates a multi-dimensional index on the collection if it does not already exist.
+Creates a multi-dimensional index on the collection if it does not already exist.
Options for creating the multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi",
fields: ["x", "y", "z"],
fieldValueTypes: "double"
});
-Creates a prefixed multi-dimensional index on the collection if it does +
Creates a prefixed multi-dimensional index on the collection if it does not already exist.
Options for creating the prefixed multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi-prefixed",
fields: ["x", "y", "z"],
prefixFields: ["x"],
fieldValueTypes: "double"
});
-Creates a prefixed multi-dimensional index on the collection if it does not already exist.
+Creates a prefixed multi-dimensional index on the collection if it does not already exist.
Options for creating the prefixed multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi-prefixed",
fields: ["x", "y", "z"],
prefixFields: ["x"],
fieldValueTypes: "double"
});
-Creates a geo index on the collection if it does not already exist.
+Creates a geo index on the collection if it does not already exist.
Options for creating the geo index.
const db = new Database();
const collection = db.collection("some-collection");
// Create an index for GeoJSON data
await collection.ensureIndex({
type: "geo",
fields: ["lngLat"],
geoJson: true
});
-Creates a inverted index on the collection if it does not already exist.
+Creates a inverted index on the collection if it does not already exist.
Options for creating the inverted index.
const db = new Database();
const collection = db.collection("some-collection");
// Create an inverted index
await collection.ensureIndex({
type: "inverted",
fields: ["a", { name: "b", analyzer: "text_en" }]
});
-Creates an index on the collection if it does not already exist.
+Creates an index on the collection if it does not already exist.
Options for creating the index.
const db = new Database();
const collection = db.collection("some-collection");
// Create a unique index for looking up documents by username
await collection.ensureIndex({
type: "persistent",
fields: ["username"],
name: "unique-usernames",
unique: true
});
-Retrieves statistics for a collection.
+Retrieves statistics for a collection.
Optional
details: booleanwhether to return extended storage engine-specific details to the figures, which may cause additional load and impact performance
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.figures();
// data contains the collection's figures
-Retrieves general information about the collection.
+Retrieves general information about the collection.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.get();
// data contains general information about the collection
-Retrieves the shardId
of the shard responsible for the given document.
Document in the collection to look up the shardId
of.
const db = new Database();
const collection = db.collection("some-collection");
const responsibleShard = await collection.getResponsibleShard();
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
The data to import, as an array of document data.
Optional
options: ImportDocumentsOptionsOptions for importing the data.
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
[
{ _key: "jcd", password: "bionicman" },
{ _key: "jreyes", password: "amigo" },
{ _key: "ghermann", password: "zeitgeist" }
]
);
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
The data to import, as an array containing a single array of attribute names followed by one or more arrays of attribute values for each document.
Optional
options: ImportDocumentsOptionsOptions for importing the data.
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
[
[ "_key", "password" ],
[ "jcd", "bionicman" ],
[ "jreyes", "amigo" ],
[ "ghermann", "zeitgeist" ]
]
);
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
If type
is omitted, data
must contain one JSON array per line with
the first array providing the attribute names and all other arrays
providing attribute values for each document.
const
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
'["_key","password"]\r\n' +
'["jcd","bionicman"]\r\n' +
'["jreyes","amigo"]\r\n' +
'["ghermann","zeitgeist"]\r\n'
);
-Returns an index description by name or id
if it exists.
Returns an index description by name or id
if it exists.
Index name, id or object with either property.
const db = new Database();
const collection = db.collection("some-collection");
const index = await collection.index("some-index");
-Returns a list of all index descriptions for the collection.
Optional
options: ListIndexesOptionsOptions for fetching the index list.
const db = new Database();
const collection = db.collection("some-collection");
const indexes = await collection.indexes();
const db = new Database();
const collection = db.collection("some-collection");
const allIndexes = await collection.indexes<HiddenIndexDescription>({
withHidden: true
});
-Instructs ArangoDB to load as many indexes of the collection into memory as permitted by the memory limit.
const db = new Database();
const collection = db.collection("indexed-collection");
await collection.loadIndexes();
// the indexes are now loaded into memory
-Retrieves the collection's properties.
+Retrieves the collection's properties.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.properties();
// data contains the collection's properties
-Replaces the properties of the collection.
+Replaces the properties of the collection.
const db = new Database();
const collection = db.collection("some-collection");
const result = await collection.setProperties({ waitForSync: true });
// the collection will now wait for data being written to disk
// whenever a document is changed
-Instructs ArangoDB to recalculate the collection's document count to fix any inconsistencies.
const db = new Database();
const collection = db.collection("inconsistent-collection");
const badData = await collection.count();
// oh no, the collection count looks wrong -- fix it!
await collection.recalculateCount();
const goodData = await collection.count();
// goodData contains the collection's improved count
-Removes an existing document from the collection.
+Removes an existing document from the collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -245,7 +245,7 @@
const
const db = new Database();
const collection = db.collection("some-collection");
const doc = await collection.document("abc123");
await collection.remove(doc);
// document with key "abc123" deleted
-Removes existing documents from the collection.
+Removes existing documents from the collection.
Throws an exception when passed any document or _id
from a different
collection.
Documents _key
, _id
or objects with either of those
@@ -253,7 +253,7 @@
constOptional
options: Omit<RemoveDocumentOptions, "ifMatch">Options for removing the documents.
const db = new Database();
const collection = db.collection("some-collection");
await collection.removeAll(["abc123", "def456"]);
// document with keys "abc123" and "def456" deleted
-Renames the collection and updates the instance's name
to newName
.
Renames the collection and updates the instance's name
to newName
.
Additionally removes the instance from the databases.Database's internal cache.
Note: Renaming collections may not be supported when ArangoDB is @@ -261,7 +261,7 @@
constParameters
- newName: string
The new name of the collection.
Returns Promise<ArangoApiResponse<CollectionDescription>>
Example
const db = new Database();
const collection1 = db.collection("some-collection");
await collection1.rename("other-collection");
const collection2 = db.collection("some-collection");
const collection3 = db.collection("other-collection");
// Note all three collection instances are different objects but
// collection1 and collection3 represent the same ArangoDB collection!
-replace
- replace(selector, newData, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}> Replaces an existing document in the collection.
+
replace
- replace(selector, newData, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}> Replaces an existing document in the collection.
Throws an exception when passed a document or _id
from a different
collection.
Parameters
- selector: DocumentSelector
Document _key
, _id
or object with either of those
@@ -270,43 +270,43 @@
Example
constOptional
options: ReplaceDocumentOptionsOptions for replacing the document.
Returns Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}>
Example
const db = new Database();
const collection = db.collection("some-collection");
await collection.save({ _key: "a", color: "blue", count: 1 });
const result = await collection.replace(
"a",
{ color: "red" },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "red" undefined
-
replace All
- replace
All(newData, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]> Replaces existing documents in the collection, identified by the _key
or
+
replace All
- replace
All(newData, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]> Replaces existing documents in the collection, identified by the _key
or
_id
of each document.
Parameters
- newData: (EntryInputType & Partial<DocumentMetadata> & (Partial<EdgeMetadata> & ({ _key: string; } | { _id: string; })))[]
The documents to replace.
Optional
options: Omit<ReplaceDocumentOptions, "ifMatch">Options for replacing the documents.
Returns Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]>
Example
const db = new Database();
const collection = db.collection("some-collection");
await collection.save({ _key: "a", color: "blue", count: 1 });
await collection.save({ _key: "b", color: "green", count: 3 });
const result = await collection.replaceAll(
[
{ _key: "a", color: "red" },
{ _key: "b", color: "yellow", count: 2 }
],
{ returnNew: true }
);
console.log(result[0].new.color, result[0].new.count); // "red" undefined
console.log(result[1].new.color, result[1].new.count); // "yellow" 2
-
revision
- revision(): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>> Retrieves the collection revision ID.
+
revision
- revision(): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>> Retrieves the collection revision ID.
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>>
Example
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.revision();
// data contains the collection's revision
-
save
- save(data, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}> Inserts a new document with the given data
into the collection.
+
save
- save(data, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}> Inserts a new document with the given data
into the collection.
Parameters
- data: DocumentData<EntryInputType>
The contents of the new document.
Optional
options: InsertDocumentOptionsOptions for inserting the document.
Returns Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
}>
Example
const db = new Database();
const collection = db.collection("some-collection");
const result = await collection.save(
{ _key: "a", color: "blue", count: 1 },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "blue" 1
-
save All
- save
All(data, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]> Inserts new documents with the given data
into the collection.
+
save All
- save
All(data, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]> Inserts new documents with the given data
into the collection.
Parameters
- data: DocumentData<EntryInputType>[]
The contents of the new documents.
Optional
options: InsertDocumentOptionsOptions for inserting the documents.
Returns Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Document<EntryResultType>;
old?: Document<EntryResultType>;
})[]>
Example
const db = new Database();
const collection = db.collection("some-collection");
const result = await collection.saveAll(
[
{ _key: "a", color: "blue", count: 1 },
{ _key: "b", color: "red", count: 2 },
],
{ returnNew: true }
);
console.log(result[0].new.color, result[0].new.count); // "blue" 1
console.log(result[1].new.color, result[1].new.count); // "red" 2
-
shards
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
+
shards
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
Parameters
Optional
details: falseIf set to true
, the response will include the responsible
servers for each shard.
-
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>>
- shards(details): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>> Retrieves the collection's shard IDs and the responsible servers for each
+
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>>
- shards(details): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>> Retrieves the collection's shard IDs and the responsible servers for each
shard.
Parameters
- details: true
If set to false
, the response will only include the
shard IDs without the responsible servers for each shard.
-
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>>
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
+
Retrieves the collection's shard IDs.
Optional
details: falseIf set to true
, the response will include the responsible
servers for each shard.
Retrieves the collection's shard IDs and the responsible servers for each +
Retrieves the collection's shard IDs and the responsible servers for each shard.
If set to false
, the response will only include the
shard IDs without the responsible servers for each shard.
Deletes all documents in the collection.
+Deletes all documents in the collection.
Optional
options: TruncateCollectionOptionsconst db = new Database();
const collection = db.collection("some-collection");
await collection.truncate();
// millions of documents cry out in terror and are suddenly silenced,
// the collection "some-collection" is now empty
-Updates an existing document in the collection.
+Updates an existing document in the collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -315,10 +315,10 @@
constOptional
options: UpdateDocumentOptionsOptions for updating the document.
const db = new Database();
const collection = db.collection("some-collection");
await collection.save({ _key: "a", color: "blue", count: 1 });
const result = await collection.update(
"a",
{ count: 2 },
{ returnNew: true }
);
console.log(result.new.color, result.new.count); // "blue" 2
-Updates existing documents in the collection, identified by the _key
or
+
Updates existing documents in the collection, identified by the _key
or
_id
of each document.
The data for updating the documents.
Optional
options: Omit<UpdateDocumentOptions, "ifMatch">Options for updating the documents.
const db = new Database();
const collection = db.collection("some-collection");
await collection.save({ _key: "a", color: "blue", count: 1 });
await collection.save({ _key: "b", color: "green", count: 3 });
const result = await collection.updateAll(
[
{ _key: "a", count: 2 },
{ _key: "b", count: 4 }
],
{ returnNew: true }
);
console.log(result[0].new.color, result[0].new.count); // "blue" 2
console.log(result[1].new.color, result[1].new.count); // "green" 4
-Represents an edge collection in a databases.Database.
+Represents an edge collection in a databases.Database.
See DocumentCollection for a more generic variant of this interface more suited for regular document collections.
See also graphs.GraphEdgeCollection for the type representing an edge @@ -11,7 +11,7 @@ by the server (including computed properties).
Type to represent edge document contents passed when inserting or replacing edge documents (without computed properties).
-Readonly
databaseDatabase this collection belongs to.
-Readonly
nameName of the collection.
-Retrieves the collection checksum.
+Readonly
nameName of the collection.
+Retrieves the collection checksum.
Optional
options: CollectionChecksumOptionsOptions for retrieving the checksum.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.checksum();
// data contains the collection's checksum
-Triggers compaction for a collection.
+Triggers compaction for a collection.
const db = new Database();
const collection = db.collection("some-collection");
await collection.compact();
// Background compaction is triggered on the collection
-Retrieves information about the number of documents in a collection.
+Retrieves information about the number of documents in a collection.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.count();
// data contains the collection's count
-Creates a collection with the given options
and the instance's name.
Creates a collection with the given options
and the instance's name.
See also databases.Database#createCollection and databases.Database#createEdgeCollection.
Note: When called on an EdgeCollection instance in TypeScript, @@ -75,7 +75,7 @@
const
interface Friend {
startDate: number;
endDate?: number;
}
const db = new Database();
const collection = db.collection("friends") as EdgeCollection<Friend>;
// even in TypeScript you still need to indicate the collection type
// if you want to create an edge collection
await collection.create({ type: CollectionType.EDGE_COLLECTION });
// the edge collection "friends" now exists
-Retrieves the document matching the given key or id.
+Retrieves the document matching the given key or id.
Throws an exception when passed a document or _id
from a different
collection, or if the document does not exist.
Document _key
, _id
or object with either of those
@@ -85,7 +85,7 @@
interface
const db = new Database();
const collection = db.collection("some-collection");
const document = await collection.document("abc123", { graceful: true });
if (document) {
console.log(document);
} else {
console.error("Document does not exist");
}
-Retrieves the document matching the given key or id.
+Retrieves the document matching the given key or id.
Throws an exception when passed a document or _id
from a different
collection, or if the document does not exist.
Document _key
, _id
or object with either of those
@@ -96,7 +96,7 @@
const
const db = new Database();
const collection = db.collection("some-collection");
const document = await collection.document("abc123", true);
if (document) {
console.log(document);
} else {
console.error("Document does not exist");
}
-Checks whether a document matching the given key or id exists in this collection.
Throws an exception when passed a document or _id
from a different
collection.
const
Optional
options: DocumentExistsOptionsconst db = new Database();
const collection = db.collection("some-collection");
const exists = await collection.documentExists("abc123");
if (!exists) {
console.log("Document does not exist");
}
-Derives a document _id
from the given selector for this collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -113,7 +113,7 @@
const
const db = new Database();
const collection1 = db.collection("some-collection");
const collection2 = db.collection("other-collection");
const meta = await collection1.save({ foo: "bar" });
// Mixing collections is usually a mistake
console.log(collection1.documentId(meta)); // ok: same collection
console.log(collection2.documentId(meta)); // throws: wrong collection
console.log(collection2.documentId(meta._id)); // also throws
console.log(collection2.documentId(meta._key)); // ok but wrong collection
-Retrieves the documents matching the given key or id values.
+Retrieves the documents matching the given key or id values.
Throws an exception when passed a document or _id
from a different
collection, or if the document does not exist.
Array of document _key
, _id
or objects with either
@@ -121,15 +121,15 @@
constOptional
options: BulkReadDocumentsOptionsOptions for retrieving the documents.
const db = new Database();
const collection = db.collection("some-collection");
try {
const documents = await collection.documents(["abc123", "xyz456"]);
console.log(documents);
} catch (e: any) {
console.error("Could not find document");
}
-Deletes the collection from the database.
+Deletes the collection from the database.
Optional
options: DropCollectionOptionsOptions for dropping the collection.
const db = new Database();
const collection = db.collection("some-collection");
await collection.drop();
// The collection "some-collection" is now an ex-collection
-Deletes the index with the given name or id
from the database.
Deletes the index with the given name or id
from the database.
Index name, id or object with either property.
const db = new Database();
const collection = db.collection("some-collection");
await collection.dropIndex("some-index");
// The index "some-index" no longer exists
-Retrieves a list of all edges in this collection of the document matching +
Retrieves a list of all edges in this collection of the document matching
the given selector
.
Throws an exception when passed a document or _id
from a different
collection.
constOptional
options: DocumentEdgesOptionsOptions for retrieving the edges.
const db = new Database();
const collection = db.collection("edges");
await collection.import([
["_key", "_from", "_to"],
["x", "vertices/a", "vertices/b"],
["y", "vertices/a", "vertices/c"],
["z", "vertices/d", "vertices/a"],
]);
const edges = await collection.edges("vertices/a");
console.log(edges.map((edge) => edge._key)); // ["x", "y", "z"]
-Creates a persistent index on the collection if it does not already exist.
+Creates a persistent index on the collection if it does not already exist.
Options for creating the persistent index.
const db = new Database();
const collection = db.collection("some-collection");
// Create a unique index for looking up documents by username
await collection.ensureIndex({
type: "persistent",
fields: ["username"],
name: "unique-usernames",
unique: true
});
-Creates a TTL index on the collection if it does not already exist.
+Creates a TTL index on the collection if it does not already exist.
Options for creating the TTL index.
const db = new Database();
const collection = db.collection("some-collection");
// Expire documents with "createdAt" timestamp one day after creation
await collection.ensureIndex({
type: "ttl",
fields: ["createdAt"],
expireAfter: 60 * 60 * 24 // 24 hours
});
const db = new Database();
const collection = db.collection("some-collection");
// Expire documents with "expiresAt" timestamp according to their value
await collection.ensureIndex({
type: "ttl",
fields: ["expiresAt"],
expireAfter: 0 // when attribute value is exceeded
});
-Creates a multi-dimensional index on the collection if it does not already exist.
+Creates a multi-dimensional index on the collection if it does not already exist.
Options for creating the multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi",
fields: ["x", "y", "z"],
fieldValueTypes: "double"
});
-Creates a prefixed multi-dimensional index on the collection if it does +
Creates a prefixed multi-dimensional index on the collection if it does not already exist.
Options for creating the prefixed multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi-prefixed",
fields: ["x", "y", "z"],
prefixFields: ["x"],
fieldValueTypes: "double"
});
-Creates a prefixed multi-dimensional index on the collection if it does not already exist.
+Creates a prefixed multi-dimensional index on the collection if it does not already exist.
Options for creating the prefixed multi-dimensional index.
const db = new Database();
const collection = db.collection("some-points");
// Create a multi-dimensional index for the attributes x, y and z
await collection.ensureIndex({
type: "mdi-prefixed",
fields: ["x", "y", "z"],
prefixFields: ["x"],
fieldValueTypes: "double"
});
-Creates a geo index on the collection if it does not already exist.
+Creates a geo index on the collection if it does not already exist.
Options for creating the geo index.
const db = new Database();
const collection = db.collection("some-collection");
// Create an index for GeoJSON data
await collection.ensureIndex({
type: "geo",
fields: ["lngLat"],
geoJson: true
});
-Creates a inverted index on the collection if it does not already exist.
+Creates a inverted index on the collection if it does not already exist.
Options for creating the inverted index.
const db = new Database();
const collection = db.collection("some-collection");
// Create an inverted index
await collection.ensureIndex({
type: "inverted",
fields: ["a", { name: "b", analyzer: "text_en" }]
});
-Creates an index on the collection if it does not already exist.
+Creates an index on the collection if it does not already exist.
Options for creating the index.
const db = new Database();
const collection = db.collection("some-collection");
// Create a unique index for looking up documents by username
await collection.ensureIndex({
type: "persistent",
fields: ["username"],
name: "unique-usernames",
unique: true
});
-Retrieves statistics for a collection.
+Retrieves statistics for a collection.
Optional
details: booleanwhether to return extended storage engine-specific details to the figures, which may cause additional load and impact performance
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.figures();
// data contains the collection's figures
-Retrieves general information about the collection.
+Retrieves general information about the collection.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.get();
// data contains general information about the collection
-Retrieves the shardId
of the shard responsible for the given document.
Document in the collection to look up the shardId
of.
const db = new Database();
const collection = db.collection("some-collection");
const responsibleShard = await collection.getResponsibleShard();
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
The data to import, as an array of edge data.
Optional
options: ImportDocumentsOptionsOptions for importing the data.
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
[
{ _key: "x", _from: "vertices/a", _to: "vertices/b", weight: 1 },
{ _key: "y", _from: "vertices/a", _to: "vertices/c", weight: 2 }
]
);
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
The data to import, as an array containing a single array of attribute names followed by one or more arrays of attribute values for each edge document.
Optional
options: ImportDocumentsOptionsOptions for importing the data.
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
[
[ "_key", "_from", "_to", "weight" ],
[ "x", "vertices/a", "vertices/b", 1 ],
[ "y", "vertices/a", "vertices/c", 2 ]
]
);
-Bulk imports the given data
into the collection.
Bulk imports the given data
into the collection.
If type
is omitted, data
must contain one JSON array per line with
the first array providing the attribute names and all other arrays
providing attribute values for each edge document.
const
const db = new Database();
const collection = db.collection("some-collection");
await collection.import(
'["_key","_from","_to","weight"]\r\n' +
'["x","vertices/a","vertices/b",1]\r\n' +
'["y","vertices/a","vertices/c",2]\r\n'
);
-Retrieves a list of all incoming edges of the document matching the given +
Retrieves a list of all incoming edges of the document matching the given
selector
.
Throws an exception when passed a document or _id
from a different
collection.
constOptional
options: DocumentEdgesOptionsOptions for retrieving the edges.
const db = new Database();
const collection = db.collection("edges");
await collection.import([
["_key", "_from", "_to"],
["x", "vertices/a", "vertices/b"],
["y", "vertices/a", "vertices/c"],
["z", "vertices/d", "vertices/a"],
]);
const edges = await collection.inEdges("vertices/a");
console.log(edges.map((edge) => edge._key)); // ["z"]
-Returns an index description by name or id
if it exists.
Returns an index description by name or id
if it exists.
Index name, id or object with either property.
const db = new Database();
const collection = db.collection("some-collection");
const index = await collection.index("some-index");
-Returns a list of all index descriptions for the collection.
Optional
options: ListIndexesOptionsOptions for fetching the index list.
const db = new Database();
const collection = db.collection("some-collection");
const indexes = await collection.indexes();
const db = new Database();
const collection = db.collection("some-collection");
const allIndexes = await collection.indexes<HiddenIndexDescription>({
withHidden: true
});
-Instructs ArangoDB to load as many indexes of the collection into memory as permitted by the memory limit.
const db = new Database();
const collection = db.collection("indexed-collection");
await collection.loadIndexes();
// the indexes are now loaded into memory
-Retrieves a list of all outgoing edges of the document matching the given +
Retrieves a list of all outgoing edges of the document matching the given
selector
.
Throws an exception when passed a document or _id
from a different
collection.
constOptional
options: DocumentEdgesOptionsOptions for retrieving the edges.
const db = new Database();
const collection = db.collection("edges");
await collection.import([
["_key", "_from", "_to"],
["x", "vertices/a", "vertices/b"],
["y", "vertices/a", "vertices/c"],
["z", "vertices/d", "vertices/a"],
]);
const edges = await collection.outEdges("vertices/a");
console.log(edges.map((edge) => edge._key)); // ["x", "y"]
-Retrieves the collection's properties.
+Retrieves the collection's properties.
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.properties();
// data contains the collection's properties
-Replaces the properties of the collection.
+Replaces the properties of the collection.
const db = new Database();
const collection = db.collection("some-collection");
const result = await collection.setProperties({ waitForSync: true });
// the collection will now wait for data being written to disk
// whenever a document is changed
-Instructs ArangoDB to recalculate the collection's document count to fix any inconsistencies.
const db = new Database();
const collection = db.collection("inconsistent-collection");
const badData = await collection.count();
// oh no, the collection count looks wrong -- fix it!
await collection.recalculateCount();
const goodData = await collection.count();
// goodData contains the collection's improved count
-Removes an existing document from the collection.
+Removes an existing document from the collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -275,7 +275,7 @@
constOptional
options: RemoveDocumentOptionsOptions for removing the document.
const db = new Database();
const collection = db.collection("friends");
const doc = await collection.document("musadir");
await collection.remove(doc);
// document with key "musadir" deleted
-Removes existing documents from the collection.
+Removes existing documents from the collection.
Throws an exception when passed any document or _id
from a different
collection.
Documents _key
, _id
or objects with either of those
@@ -283,7 +283,7 @@
constOptional
options: RemoveDocumentOptionsOptions for removing the documents.
const db = new Database();
const collection = db.collection("friends");
await collection.removeAll(["musadir", "salman"]);
// document with keys "musadir" and "salman" deleted
-Renames the collection and updates the instance's name
to newName
.
Renames the collection and updates the instance's name
to newName
.
Additionally removes the instance from the databases.Database's internal cache.
Note: Renaming collections may not be supported when ArangoDB is @@ -291,7 +291,7 @@
constParameters
- newName: string
The new name of the collection.
Returns Promise<ArangoApiResponse<CollectionDescription>>
Example
const db = new Database();
const collection1 = db.collection("some-collection");
await collection1.rename("other-collection");
const collection2 = db.collection("some-collection");
const collection3 = db.collection("other-collection");
// Note all three collection instances are different objects but
// collection1 and collection3 represent the same ArangoDB collection!
-replace
- replace(selector, newData, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}> Replaces an existing document in the collection.
+
replace
- replace(selector, newData, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}> Replaces an existing document in the collection.
Throws an exception when passed a document or _id
from a different
collection.
Parameters
- selector: DocumentSelector
Document _key
, _id
or object with either of those
@@ -300,43 +300,43 @@
Example
constOptional
options: ReplaceDocumentOptionsOptions for replacing the document.
Returns Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}>
Example
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
const result = await collection.replace(
"musadir",
{ active: false },
{ returnNew: true }
);
console.log(result.new.active, result.new.best); // false undefined
-
replace All
- replace
All(newData, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]> Replaces existing documents in the collection, identified by the _key
or
+
replace All
- replace
All(newData, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]> Replaces existing documents in the collection, identified by the _key
or
_id
of each document.
Parameters
- newData: (EntryInputType & Partial<DocumentMetadata> & (Partial<EdgeMetadata> & ({ _key: string; } | { _id: string; })))[]
The documents to replace.
Optional
options: ReplaceDocumentOptionsOptions for replacing the documents.
Returns Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]>
Example
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
await collection.save(
{
_key: "salman",
_from: "users/rana",
_to: "users/salman",
active: false,
best: false
}
);
const result = await collection.replaceAll(
[
{ _key: "musadir", active: false },
{ _key: "salman", active: true, best: true }
],
{ returnNew: true }
);
console.log(result[0].new.active, result[0].new.best); // false undefined
console.log(result[1].new.active, result[1].new.best); // true true
-
revision
- revision(): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>> Retrieves the collection revision ID.
+
revision
- revision(): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>> Retrieves the collection revision ID.
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
revision: string;
}>>
Example
const db = new Database();
const collection = db.collection("some-collection");
const data = await collection.revision();
// data contains the collection's revision
-
save
- save(data, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}> Inserts a new document with the given data
into the collection.
+
save
- save(data, options?): Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}> Inserts a new document with the given data
into the collection.
Parameters
- data: EdgeData<EntryInputType>
The contents of the new document.
Optional
options: InsertDocumentOptionsOptions for inserting the document.
Returns Promise<DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
}>
Example
const db = new Database();
const collection = db.collection("friends");
const result = await collection.save(
{ _from: "users/rana", _to: "users/mudasir", active: false },
{ returnNew: true }
);
-
save All
- save
All(data, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]> Inserts new documents with the given data
into the collection.
+
save All
- save
All(data, options?): Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]> Inserts new documents with the given data
into the collection.
Parameters
- data: EdgeData<EntryInputType>[]
The contents of the new documents.
Optional
options: InsertDocumentOptionsOptions for inserting the documents.
Returns Promise<(DocumentOperationFailure | DocumentMetadata & {
_oldRev?: string;
} & {
new?: Edge<EntryResultType>;
old?: Edge<EntryResultType>;
})[]>
Example
const db = new Database();
const collection = db.collection("friends");
const result = await collection.saveAll(
[
{ _from: "users/rana", _to: "users/mudasir", active: false },
{ _from: "users/rana", _to: "users/salman", active: true }
],
{ returnNew: true }
);
-
shards
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
+
shards
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
Parameters
Optional
details: falseIf set to true
, the response will include the responsible
servers for each shard.
-
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>>
- shards(details): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>> Retrieves the collection's shard IDs and the responsible servers for each
+
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>>
- shards(details): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>> Retrieves the collection's shard IDs and the responsible servers for each
shard.
Parameters
- details: true
If set to false
, the response will only include the
shard IDs without the responsible servers for each shard.
-
Returns Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: Record<string, string[]>;
}>>
- shards(details?): Promise<ArangoApiResponse<CollectionDescription & CollectionProperties & {
shards: string[];
}>> Retrieves the collection's shard IDs.
+
Retrieves the collection's shard IDs.
Optional
details: falseIf set to true
, the response will include the responsible
servers for each shard.
Retrieves the collection's shard IDs and the responsible servers for each +
Retrieves the collection's shard IDs and the responsible servers for each shard.
If set to false
, the response will only include the
shard IDs without the responsible servers for each shard.
Deletes all documents in the collection.
+Deletes all documents in the collection.
Optional
options: TruncateCollectionOptionsconst db = new Database();
const collection = db.collection("some-collection");
await collection.truncate();
// millions of documents cry out in terror and are suddenly silenced,
// the collection "some-collection" is now empty
-Updates an existing document in the collection.
+Updates an existing document in the collection.
Throws an exception when passed a document or _id
from a different
collection.
Document _key
, _id
or object with either of those
@@ -345,10 +345,10 @@
constOptional
options: UpdateDocumentOptionsOptions for updating the document.
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
const result = await collection.update(
"musadir",
{ active: false },
{ returnNew: true }
);
console.log(result.new.active, result.new.best); // false true
-Updates existing documents in the collection, identified by the _key
or
+
Updates existing documents in the collection, identified by the _key
or
_id
of each document.
The data for updating the documents.
Optional
options: UpdateDocumentOptionsOptions for updating the documents.
const db = new Database();
const collection = db.collection("friends");
await collection.save(
{
_key: "musadir",
_from: "users/rana",
_to: "users/mudasir",
active: true,
best: true
}
);
await collection.save(
{
_key: "salman",
_from: "users/rana",
_to: "users/salman",
active: false,
best: false
}
);
const result = await collection.updateAll(
[
{ _key: "musadir", active: false },
{ _key: "salman", active: true, best: true }
],
{ returnNew: true }
);
console.log(result[0].new.active, result[0].new.best); // false true
console.log(result[1].new.active, result[1].new.best); // true true
-Processed response object.
-Processed response object.
+Readonly
arrayReadonly
blobReadonly
bodyReadonly
bodyReadonly
cloneReadonly
formThis method is not recommended for parsing multipart/form-data bodies in server environments. +
Readonly
arrayReadonly
blobReadonly
bodyReadonly
bodyReadonly
cloneReadonly
formThis method is not recommended for parsing multipart/form-data bodies in server environments. It is recommended to use a library such as @fastify/busboy as follows:
import { Busboy } from '@fastify/busboy'
import { Readable } from 'node:stream'
const response = await fetch('...')
const busboy = new Busboy({ headers: { 'content-type': response.headers.get('content-type') } })
// handle events emitted from `busboy`
Readable.fromWeb(response.body).pipe(busboy)
-Readonly
headersReadonly
jsonReadonly
okOptional
parsedParsed response body.
-Readonly
redirectedFetch request object.
-Readonly
statusReadonly
statusReadonly
textReadonly
typeReadonly
urlReadonly
headersReadonly
jsonReadonly
okOptional
parsedParsed response body.
+Readonly
redirectedFetch request object.
+Readonly
statusReadonly
statusReadonly
textReadonly
typeReadonly
urlA low-level interface for consuming the items of a BatchCursor.
-Readonly
isOptions for creating a stored value in an ArangoSearch View.
-Options for creating a stored value in an ArangoSearch View.
+Optional
cache(Enterprise Edition only.) If set to true
, then stored values will
always be cached in memory.
Default: false
Optional
compressionHow the attribute values should be compressed.
+Optional
compressionHow the attribute values should be compressed.
Default: "lz4"
Attribute paths for which values should be stored in the view index +
Attribute paths for which values should be stored in the view index
in addition to those used for sorting via primarySort
.
import type { VersionInfo } from "arangojs/administration";
+administration | arangojs Module administration
import type { VersionInfo } from "arangojs/administration";
The "administration" module provides types for database administration.
-Index
Interfaces
Index
Interfaces
Type Aliases
Cluster Support Info
Compact Options
Engine Info
diff --git a/devel/modules/analyzers.html b/devel/modules/analyzers.html
index 7bc2a0045..d44dc7956 100644
--- a/devel/modules/analyzers.html
+++ b/devel/modules/analyzers.html
@@ -1,8 +1,8 @@
-analyzers | arangojs Module analyzers
import type { Analyzer } from "arangojs/analyzers";
+analyzers | arangojs Module analyzers
import type { Analyzer } from "arangojs/analyzers";
The "analyzers" module provides Analyzer related types and interfaces
for TypeScript.
-Index
Classes
Analyzer
+Index
Classes
Type Aliases
Analyzer Description
Analyzer Description Type
Analyzer Feature
diff --git a/devel/modules/aql.html b/devel/modules/aql.html
index 63a2dff9f..f516b9987 100644
--- a/devel/modules/aql.html
+++ b/devel/modules/aql.html
@@ -1,9 +1,9 @@
-aql | arangojs Module aql
import { aql } from "arangojs/aql";
+aql | arangojs Module aql
import { aql } from "arangojs/aql";
The "aql" module provides the aql template string handler and
helper functions, as well as associated types and interfaces for TypeScript.
The aql function and namespace is also re-exported by the "index" module.
-Index
Interfaces
Index
Interfaces
Type Aliases
Aql Value
diff --git a/devel/modules/cluster.html b/devel/modules/cluster.html
index a60cb993e..22e548339 100644
--- a/devel/modules/cluster.html
+++ b/devel/modules/cluster.html
@@ -1,7 +1,7 @@
-cluster | arangojs Module cluster
import type { ClusterImbalanceInfo } from "arangojs/cluster";
+cluster | arangojs Module cluster
import type { ClusterImbalanceInfo } from "arangojs/cluster";
The "cluster" module provides types for cluster management.
-Index
Type Aliases
Index
Type Aliases
Cluster Imbalance Info
Cluster Rebalance Move
Cluster Rebalance Options
Cluster Rebalance Result
diff --git a/devel/modules/collections.html b/devel/modules/collections.html
index 86a3696d6..8127754ff 100644
--- a/devel/modules/collections.html
+++ b/devel/modules/collections.html
@@ -1,8 +1,8 @@
-collections | arangojs Module collections
import type {
DocumentCollection,
EdgeCollection,
} from "arangojs/collections";
+collections | arangojs Module collections
import type {
DocumentCollection,
EdgeCollection,
} from "arangojs/collections";
The "collections" module provides collection related types and interfaces
for TypeScript.
-Index
Enumerations
Index
Enumerations
Interfaces
Arango Collection
Document Collection
diff --git a/devel/modules/configuration.html b/devel/modules/configuration.html
index d81d77e5a..a3beec7c4 100644
--- a/devel/modules/configuration.html
+++ b/devel/modules/configuration.html
@@ -1,8 +1,8 @@
-configuration | arangojs Module configuration
import type { ConfigOptions } from "arangojs/configuration";
+configuration | arangojs Module configuration
import type { ConfigOptions } from "arangojs/configuration";
The "configuration" module provides configuration related types for
TypeScript.
-Index
Type Aliases
Index
Type Aliases
Basic Auth Credentials
Bearer Auth Credentials
Config Options
Load Balancing Strategy
diff --git a/devel/modules/connection.html b/devel/modules/connection.html
index c8c0561f0..fdaa87154 100644
--- a/devel/modules/connection.html
+++ b/devel/modules/connection.html
@@ -1,7 +1,7 @@
-connection | arangojs Module connection
import type { ArangoApiResponse } from "arangojs/connection";
+connection | arangojs Module connection
import type { ArangoApiResponse } from "arangojs/connection";
The "connection" module provides connection related types for TypeScript.
-Index
Interfaces
Index
Interfaces
Type Aliases
Arango Api Response
Arango Error Response
Arango Response Metadata
diff --git a/devel/modules/cursors.html b/devel/modules/cursors.html
index 5db40f9ba..9d1662230 100644
--- a/devel/modules/cursors.html
+++ b/devel/modules/cursors.html
@@ -1,8 +1,8 @@
-cursors | arangojs Module cursors
import type { Cursor, BatchCursor } from "arangojs/cursors";
+cursors | arangojs Module cursors
import type { Cursor, BatchCursor } from "arangojs/cursors";
The "cursors" module provides cursor-related types and interfaces for
TypeScript.
-Index
Classes
Index
Classes
Interfaces
Type Aliases
Cursor Extras
diff --git a/devel/modules/databases.html b/devel/modules/databases.html
index 490008ba2..0cd84f2d3 100644
--- a/devel/modules/databases.html
+++ b/devel/modules/databases.html
@@ -1,9 +1,9 @@
-databases | arangojs Module databases
import { Database } from "arangojs/databases";
+databases | arangojs Module databases
import { Database } from "arangojs/databases";
The "databases" module provides the Database class and associated
types and interfaces for TypeScript.
The Database class is also re-exported by the "index" module.
-Index
Classes
Database
+Index
Classes
Type Aliases
Functions
is Arango Database
diff --git a/devel/modules/documents.html b/devel/modules/documents.html
index a00474465..191972670 100644
--- a/devel/modules/documents.html
+++ b/devel/modules/documents.html
@@ -1,7 +1,7 @@
-documents | arangojs Module documents
import type { Document, Edge } from "arangojs/documents";
+documents | arangojs Module documents
import type { Document, Edge } from "arangojs/documents";
The "documents" module provides document/edge related types for TypeScript.
-Index
Type Aliases
Index
Type Aliases
Bulk Read Documents Options
Document
Document Data
Document Edges Options
diff --git a/devel/modules/errors.html b/devel/modules/errors.html
index a24acc32a..9dc507b85 100644
--- a/devel/modules/errors.html
+++ b/devel/modules/errors.html
@@ -1,8 +1,8 @@
-errors | arangojs Module errors
import type { ArangoError, HttpError } from "arangojs/errors";
+errors | arangojs Module errors
import type { ArangoError, HttpError } from "arangojs/errors";
The "errors" module provides types and interfaces for TypeScript related
to arangojs error handling.
-Index
Classes
Index
Classes
Arango Error
Fetch Failed Error
Http Error
Network Error
diff --git a/devel/modules/foxx_manifest.html b/devel/modules/foxx_manifest.html
index ca0746d41..d3661b861 100644
--- a/devel/modules/foxx_manifest.html
+++ b/devel/modules/foxx_manifest.html
@@ -1,9 +1,9 @@
-foxx-manifest | arangojs Module foxx-manifest
import type { FoxxManifest } from "arangojs/foxx-manifest";
+foxx-manifest | arangojs Module foxx-manifest
import type { FoxxManifest } from "arangojs/foxx-manifest";
The "foxx-manifest" module provides the Foxx manifest type for TypeScript.
Generated from JSON Schema
using json-schema-to-typescript
.
-Index
Type Aliases
Index
Type Aliases
Configuration
Dependency
File
Foxx Manifest
diff --git a/devel/modules/graphs.html b/devel/modules/graphs.html
index c816ae371..f34747c55 100644
--- a/devel/modules/graphs.html
+++ b/devel/modules/graphs.html
@@ -1,8 +1,8 @@
-graphs | arangojs Module graphs
import type {
Graph,
GraphVertexCollection,
GraphEdgeCollection,
} from "arangojs/graphs";
+graphs | arangojs Module graphs
import type {
Graph,
GraphVertexCollection,
GraphEdgeCollection,
} from "arangojs/graphs";
The "graphs" module provides graph related types and interfaces
for TypeScript.
-Index
Classes
Graph
+Index
Classes
Type Aliases
Add Edge Definition Options
diff --git a/devel/modules/hot_backups.html b/devel/modules/hot_backups.html
index f712fa053..717c5e718 100644
--- a/devel/modules/hot_backups.html
+++ b/devel/modules/hot_backups.html
@@ -1,7 +1,7 @@
-hot-backups | arangojs Module hot-backups
import type { HotBackupOptions } from "arangojs/hot-backups";
+hot-backups | arangojs Module hot-backups
import type { HotBackupOptions } from "arangojs/hot-backups";
The "hot-backups" module provides types for managing hot backups.
-Index
Type Aliases
Index
Type Aliases
\ No newline at end of file
diff --git a/devel/modules/index.html b/devel/modules/index.html
index 9a0aae267..54bd24411 100644
--- a/devel/modules/index.html
+++ b/devel/modules/index.html
@@ -1,11 +1,11 @@
-index | arangojs Module index
import arangojs, { aql, Database } from "arangojs";
+index | arangojs Module index
import arangojs, { aql, Database } from "arangojs";
The "index" module is the default entry point when importing the arangojs
module or using the web build in the browser.
If you are just getting started, you probably want to use the
arangojs function, which is also the default export of this module,
or the databases.Database class for which it is a wrapper.
- Index
References
Database
+ Index
References
Functions
arangojs
diff --git a/devel/modules/indexes.html b/devel/modules/indexes.html
index a657294e3..b4b67ccce 100644
--- a/devel/modules/indexes.html
+++ b/devel/modules/indexes.html
@@ -1,7 +1,7 @@
-indexes | arangojs Module indexes
import type {
FulltextIndex,
GeoIndex,
MdiIndex,
PersistentIndex,
PrimaryIndex,
TtlIndex,
} from "arangojs/indexes";
+indexes | arangojs Module indexes
import type {
FulltextIndex,
GeoIndex,
MdiIndex,
PersistentIndex,
PrimaryIndex,
TtlIndex,
} from "arangojs/indexes";
The "indexes" module provides index-related types for TypeScript.
-Index
Type Aliases
Index
Type Aliases
Arangosearch Index Description
Edge Index
Edge Index Description
Ensure Geo Index Options
diff --git a/devel/modules/jobs.html b/devel/modules/jobs.html
index 97d4039fa..71f552328 100644
--- a/devel/modules/jobs.html
+++ b/devel/modules/jobs.html
@@ -1,5 +1,5 @@
-jobs | arangojs
Represents an Analyzer in a databases.Database.
-