AQL query results

The result set of an AQL query is always an array of values, even if it returns a single element only

AQL queries and also subqueries each produce an array with zero or more elements.

An empty array typically means that no (matching) data was found to act upon, or that a write query didn’t specify anything to return.

FOR doc IN emptyCollection
  RETURN doc  // no documents
FOR u IN users
  FILTER age == -1  // no matches
  RETURN u
UPDATE { id: 2, active: true } IN users
// no RETURN operation

The result set of the above examples is empty:

[ ]

If there is a single result, you get an array with one element back, not the result value only.

FOR u IN users
  LIMIT 1
  RETURN u.name
[ "John" ]

If there are multiple results, you get an array with many elements back.

FOR u IN users
  RETURN u.name
[
  "John",
  "Vanessa",
  "Amy"
]

The individual values in the result array of a query may or may not have a homogeneous structure, depending on what is actually queried.

For example, the individual documents of a collection can use different sets of attribute names. When returning data from a collection with inhomogeneous documents without modification, the result values have an inhomogeneous structure, too. Each result value itself is a document:

FOR u IN users
  RETURN u
[
  { "id": 1, "name": "John", "active": false },
  { "age": 32, "id": 2, "name": "Vanessa" },
  { "friends": [ "John", "Vanessa" ], "id": 3, "name": "Amy" }
]

However, if a fixed set of attributes from the collection is queried, then the query result values have a homogeneous structure. Each result value is still (a projection of) a document:

FOR u IN users
  RETURN { "id": u.id, "name": u.name }
[
  { "id": 1, "name": "John" },
  { "id": 2, "name": "Vanessa" },
  { "id": 3, "name": "Amy" }
]

It is also possible to query scalar values only. In this case, the result set is an array of scalars, and each result value is a scalar value:

FOR u IN users
  RETURN u.id
[ 1, 2, 3 ]