the multi-model NoSQL database

A distributed free and open-source database with a flexible data model for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.

Download

Get started

User Survey
get your Arango T-Shirt

  • Multi-ModelDocuments, graphs and key-value pairs — model your data as you see fit for your application.

    read more

  • Joins, Joins, JoinsConveniently join what belongs together for flexible ad-hoc querying, less data redundancy.

    read more

  • TransactionsEasy application development keeping your data consistent and safe. No hassle in your client.

    read more

persons and cities are documents; friendship relation is a graph; fast lookup by identifier
FOR p In Persons
  FILTER myfunctions::mustPayTax(p)
  LET distance = LENGTH(
    SHORTEST_PATH(Persons, Friends, p, 'Persons/godfather', 'any'))
join persons with their cities using fast hash lookup, even when sharding
  FOR c IN Cities
     FILTER p.zip == c.zip
all modifications together behave as transactions or sub-transactions
      UPDATE p WITH {taxPaid: p.taxPaid * c.discount * distance}
        IN Persons

ArangoDB Query Language

Describe document and graph queries in a self-explaining query language. Easy to learn, easy to join.

Build your own Microservices

Foxx

Use the Foxx framework to expose queries, traversals and database operations as REST/Web API. No need to copy queries to every new client you write. Simply create a microservices to access the data the way you like. Enhance security by access control down to field level.

Query Builder
AQL
var Foxx = require("org/arangodb/foxx"),
    controller = new Foxx.Controller(applicationContext),
    joi = require("joi"),
qb = require("aqb"),
    db = require("internal").db;

controller.put("/myfoxxapp/taxhouses/:godfather",
  function(req, res) {
    res.json(db._query(
'FOR p In Persons' +
  'FILTER myfunctions::mustPayTax(p)' +
    'LET distance = LENGTH(' +
      'SHORTEST_PATH(Persons, Friends, p, @godfather, 'any'))' +
    'FOR c IN Cities' +
      'FILTER p.zip == c.zip' +
      'UPDATE p WITH {taxPaid: p.taxPaid * c.discount * distance}' +
        'IN Persons',
qb.for("p").in("Persons")
  .filter(qb.fn("myfunctions::mustPayTax")("p"))
  .let("distance", qb.LENGTH(qb.SHORTEST_PATH(
      "Persons", "Friends", "p", "@godfather", "any")))
  .for("c").in("Cities")
    .filter(qb.eq("p.zip", "c.zip"))
      .update("p").with_(
        {taxPaid: qb.mul("p.taxPaid", "c.discount", "distance")})
        .in("Persons"),
      {godfather: req.params("godfather")}
    ).toArray());
  }).pathParam("godfather", joi.string().required());