3.5 KiB
Queries
This function implements the HTTP API for single roundtrip AQL queries.
For collection-specific queries see simple queries.
database.query
async database.query(query, [bindVars,] [opts]): Cursor
Performs a database query using the given query and bindVars, then returns a new Cursor instance for the result list.
Arguments
-
query:
string
An AQL query string or a query builder instance.
-
bindVars:
Object
(optional)An object defining the variables to bind the query to.
-
opts:
Object
(optional)Additional parameter object that will be passed to the query API. Possible keys are count and options (explained below)
If opts.count is set to true
, the cursor will have a count property set to
the query result count.
Possible key options in opts.options include: failOnWarning, cache, profile or skipInaccessibleCollections.
For a complete list of query settings please reference the arangodb.com documentation.
If query is an object with query and bindVars properties, those will be used as the values of the respective arguments instead.
Examples
const db = new Database();
const active = true;
// Using the aql template tag
const cursor = await db.query(aql`
FOR u IN _users
FILTER u.authData.active == ${active}
RETURN u.user
`);
// cursor is a cursor for the query result
// -- or --
// Old-school JS with explicit bindVars:
db.query(
'FOR u IN _users ' +
'FILTER u.authData.active == @active ' +
'RETURN u.user',
{active: true}
).then(function (cursor) {
// cursor is a cursor for the query result
});
aql
aql(strings, ...args): Object
Template string handler (aka template tag) for AQL queries. Converts a template
string to an object that can be passed to database.query
by converting
arguments to bind variables.
Note: If you want to pass a collection name as a bind variable, you need to
pass a Collection instance (e.g. what you get by passing the collection name
to db.collection
) instead. If you see the error "array expected as operand to FOR loop"
, you're likely passing a collection name instead of a collection
instance.
Examples
const userCollection = db.collection("_users");
const role = "admin";
const query = aql`
FOR user IN ${userCollection}
FILTER user.role == ${role}
RETURN user
`;
// -- is equivalent to --
const query = {
query: "FOR user IN @@value0 FILTER user.role == @value1 RETURN user",
bindVars: { "@value0": userCollection.name, value1: role }
};
Note how the aql template tag automatically handles collection references
(@@value0
instead of @value0
) for us so you don't have to worry about
counting at-symbols.
Because the aql template tag creates actual bindVars instead of inlining values directly, it also avoids injection attacks via malicious parameters:
// malicious user input
const email = '" || (FOR x IN secrets REMOVE x IN secrets) || "';
// DON'T do this!
const query = `
FOR user IN users
FILTER user.email == "${email}"
RETURN user
`;
// FILTER user.email == "" || (FOR x IN secrets REMOVE x IN secrets) || ""
// instead do this!
const query = aql`
FOR user IN users
FILTER user.email == ${email}
RETURN user
`;
// FILTER user.email == @value0