ArangoDB v3.4 reached End of Life (EOL) and is no longer supported.

This documentation is outdated. Please see the most recent version here: Latest Docs

AQL Helpers

These helpers are available via the aql export from the arangojs module:

import arangojs, { aql } from "arangojs";

// or CommonJS:

const arangojs = require("arangojs");
const aql = arangojs.aql;

aql

aql: AqlQuery

The aql function is a JavaScript template string handler (or template tag). It 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.

To use it just prefix a JavaScript template string (the ones with backticks instead of quotes) with its import name (e.g. aql) and pass in variables like you would with a regular template string. The string will automatically be converted into an object with query and bindVars attributes which you can pass directly to db.query to execute. If you pass in a collection it will be automatically recognized as a collection reference and handled accordingly.

The aql template tag can also be used inside other aql template strings, allowing arbitrary nesting. Bind parameters of nested queries will be merged automatically.

Examples

const filterValue = 23;
const mydata = db.collection("mydata");
const result = await db.query(aql`
  FOR d IN ${mydata}
  FILTER d.num > ${filterValue}
  RETURN d
`);

// nested queries

const color = "green";
const filterByColor = aql`FILTER d.color == ${color}'`;
const result2 = await db.query(aql`
  FOR d IN ${mydata}
  ${filterByColor}
  RETURN d
`);

aql.literal

aql.literal(value): AqlLiteral

The aql.literal helper can be used to mark strings to be inlined into an AQL query when using the aql template tag, rather than being treated as a bind parameter.

Any value passed to aql.literal will be treated as part of the AQL query. To avoid becoming vulnerable to AQL injection attacks you should always prefer nested aql queries if possible.

Arguments

  • value: string

    An arbitrary string that will be treated as a literal AQL fragment when used in an aql template.

Examples

const filterGreen = aql.literal('FILTER d.color == "green"');
const result = await db.query(aql`
  FOR d IN ${mydata}
  ${filterGreen}
  RETURN d
`);

aql.join

aql.join(values)

The aql.join helper takes an array of queries generated using the aql tag and combines them into a single query. The optional second argument will be used as literal string to combine the queries.

Arguments

  • values: Array

    An array of arbitrary values, typically AQL query objects or AQL literals.

  • sep: string (Default: " ")

    String that will be used in between the values.

Examples

// Basic usage
const parts = [aql`FILTER`, aql`x`, aql`%`, aql`2`];
const joined = aql.join(parts); // aql`FILTER x % 2`

// Merge without the extra space
const parts = [aql`FIL`, aql`TER`];
const joined = aql.join(parts, ""); // aql`FILTER`;

// Real world example: translate keys into document lookups
const users = db.collection("users");
const keys = ["abc123", "def456"];
const docs = keys.map(key => aql`DOCUMENT(${users}, ${key})`);
const aqlArray = aql`[${aql.join(docs, ", ")}]`;
const result = await db.query(aql`
  FOR d IN ${aqlArray}
  RETURN d
`);
// Query:
//   FOR d IN [DOCUMENT(@@value0, @value1), DOCUMENT(@@value0, @value2)]
//   RETURN d
// Bind parameters:
//   @value0: "users"
//   value1: "abc123"
//   value2: "def456"

// Alternative without `aql.join`
const users = db.collection("users");
const keys = ["abc123", "def456"];
const result = await db.query(aql`
  FOR key IN ${keys}
  LET d = DOCUMENT(${users}, key)
  RETURN d
`);
// Query:
//   FOR key IN @value0
//   LET d = DOCUMENT(@@value1, key)
//   RETURN d
// Bind parameters:
//   value0: ["abc123", "def456"]
//   @value1: "users"