Create Test Data with AQL

How to fill a collection with dummy documents

We assume that there is already a collection to the hold documents called myCollection in below example queries.

One of the easiest ways to fill a collection with test data is to use an AQL query that iterates over a range.

Run the following AQL query e.g. from the AQL Editor in the web interface to insert 1,000 documents into the collection:

FOR i IN 1..1000
  INSERT { name: CONCAT("test", i) } IN myCollection

The number of documents to create can be modified easily be adjusting the range boundary values.

If you want to inspect the result immediately, add RETURN NEW at the end of the query.

To create more complex test data, adjust the AQL query. Let us say we also want a status attribute, and fill it with integer values between 1 to 5 (inclusive), with equal distribution. A good way to achieve this is to use the modulo operator (%):

FOR i IN 1..1000
  INSERT {
    name: CONCAT("test", i),
    status: 1 + (i % 5)
  } IN myCollection

To create pseudo-random values, use the RAND() function. It creates pseudo-random numbers between 0 and 1. Use some factor to scale the random numbers, and FLOOR() to convert the scaled number back to an integer.

For example, the following query populates the value attribute with numbers between 100 and 150 (inclusive):

FOR i IN 1..1000
  INSERT {
    name: CONCAT("test", i),
    value: 100 + FLOOR(RAND() * (150 - 100 + 1))
  } IN myCollection

After the test data has been created, it is often helpful to verify it. The RAND() function is also a good candidate for retrieving a random sample of the documents in the collection. This query will retrieve 10 random documents:

FOR doc IN myCollection
  SORT RAND()
  LIMIT 10
  RETURN doc

The COLLECT clause is an easy mechanism to run an aggregate analysis on some attribute. Let us say we wanted to verify the data distribution inside the status attribute. In this case we could run:

FOR doc IN myCollection
  COLLECT value = doc.value WITH COUNT INTO count
  RETURN {
    value: value,
    count: count
  }

The above query will provide the number of documents per distinct value.

We can make the JSON result a bit more compact by using the value as attribute key, the count as attribute value and merge everything into a single result object. Note that attribute keys can only be strings, but for our purposes here it is acceptable.

RETURN MERGE(
  FOR doc IN myCollection
    COLLECT value = doc.value WITH COUNT INTO count
    RETURN {
      [value]: count
    }
)